Clean the environment.

Set locations, and the working directory …


Defining phenotypes and datasets.

Create a new analysis directory, including subdirectories.
[1] FALSE
[1] FALSE
[1] FALSE
[1] FALSE

Setting working directory and listing its contents.
[1] "/Volumes/LaCie/PLINK/analyses/lookups/AE_TEMPLATE/scRNAseq"
[1] "20211029.AESCRNA.scrnaseq_results.RData" "AESCRNA"                                 "scRNAseq.nb.html"                        "scRNAseq.Rmd"                           

… a package-installation function …

… and load those packages.

We will create a datestamp and define the Utrecht Science Park Colour Scheme.

1 ERA-CVD ‘druggable-MI-targets’

For the ERA-CVD ‘druggable-MI-targets’ project (grantnumber: 01KL1802) we will perform two related RNA sequencing (RNAseq) experiments:

  1. conventional (‘bulk’) RNAseq using RNA extracted from carotid plaque samples, n ± 700. As of Friday, October 29, 2021 all samples have been selected and RNA has been extracted; quality control (QC) was performed and we have a dataset of 635 samples.

  2. single-cell RNAseq (scRNAseq) of at least n = 40 samples (20 females, 20 males). As of Friday, October 29, 2021 data is available of 40 samples (3 females, 15 males), we are extending sampling to get more female samples.

Plaque samples are derived from carotid endarterectomies as part of the Athero-Express Biobank Study which is an ongoing study in the UMC Utrecht.

2 Background

Collaboration to study gene expression of PCSK9 in relation to atherosclerotic plaques characteristics. The main list of genes are given below.

  • Genes.xlsx
library(openxlsx)

# Manual option
# gene_list <- c("PCSK9", "COL4A1", "COL4A2", "COL3A", "COL2A", "LDLR", "CD36")
# gene_list

gene_list <- read.xlsx(paste0(PROJECTROOT_loc, "/SNP/Genes.xlsx"), sheet = "Genes")

DT::datatable(gene_list)

target_genes <- unlist(gene_list$Gene)
target_genes
[1] "PCSK9"  "COL4A1" "COL4A2" "COL3A"  "COL2A"  "LDLR"   "CD36"  

3 Load data

First we will load the data:

  • scRNAseq experimental data and rename the cell types.
  • Athero-Express clinical data.

3.1 AESCRNA: single-cell RNAseq from carotid plaques

Here we load the latest dataset from our Athero-Express Single Cell RNA experiment.

There are few datasets available:

  • 20210316_CircRes2020_18pts.RDS > the data associated with Depuydt M.A.C et al.
  • 20200701_seurat_37_pts.RDS > the data of 37 patients
  • 20210217_PlaqView_38_pts.RDS > the data associated with PlaqView; this can not be couple to study numbers
  • 20210811_46_patients_Koen.RDS > the latest dataset - NOTE: failes to open ‘unknown input format’

Here we use the PlaqView data.


scRNAseqData <- readRDS(paste0(RAWDATA, "/Seuset_40_patients/seurat_37_pts_20200701.RDS"))
scRNAseqData
An object of class Seurat 
38835 features across 6191 samples within 2 assays 
Active assay: SCT (18283 features, 3000 variable features)
 1 other assay present: RNA
 2 dimensional reductions calculated: pca, umap
N_GENES=18283

The naming/classification is based on a combination conventional markers. We do not claim to know the exact identity of each cell, rather we refer to cells as ‘KIT+ Mast cells”-like cells. Likewise we refer to the cell clusters as ’communities’ of cells that exihibit similar properties, i.e. similar defining markers (e.g. KIT).

We will rename the cell types to human readable names.

### change names for clarity
backup.scRNAseqData = scRNAseqData
# get the old names to change to new names
UMAPPlot(scRNAseqData, label = FALSE, pt.size = 1.25, label.size = 4, group.by = "ident")


levels(unique(scRNAseqData@active.ident))
 [1] "CD3+CD8A+ T cells I"         "CD3+CD8A+ T cells III"       "CD3+CD4+ T Cells I"          "CD14+CD68+ Macrophages I"    "Mixed Cells I"               "CD3+CD8A+ T Cells II"       
 [7] "CD14+CD68+ Macrophages II"   "CD3+CD4+ T Cells II"         "ACTA2+ Smooth Muscle Cells"  "CD34+ Endothelial Cells I"   "CD34+ Endothelial Cells II"  "NCAM1+ Natural Killer Cells"
[13] "Mixed Cells II"              "CD79A+ B Cells I"            "CD14+CD68+ Macrophages III"  "CD3+ Regulatory T Cells"     "KIT+ Mast Cells"             "CD79A+ B Cells II"          
# [1] "CD3+CD8A+ T cells I"         "CD3+CD8A+ T cells III"       "CD3+CD4+ T Cells I"          "CD14+CD68+ Macrophages I"   
# [5] "Mixed Cells I"               "CD3+CD8A+ T Cells II"        "CD14+CD68+ Macrophages II"   "CD3+CD4+ T Cells II"        
# [9] "ACTA2+ Smooth Muscle Cells"  "CD34+ Endothelial Cells I"   "CD34+ Endothelial Cells II"  "NCAM1+ Natural Killer Cells"
#[13] "Mixed Cells II"              "CD79A+ B Cells I"            "CD14+CD68+ Macrophages III"  "CD3+ Regulatory T Cells"    
#[17] "KIT+ Mast Cells"             "CD79A+ B Cells II"  

celltypes <- c("CD14+CD68+ Macrophages I" = "CD14+CD68+ M I", 
               "CD14+CD68+ Macrophages II" = "CD14+CD68+ M II", 
               "CD14+CD68+ Macrophages III" = "CD14+CD68+ M III",
               "CD3+CD8A+ T cells I" = "CD3+CD8+ T I",
               "CD3+CD8A+ T Cells II" = "CD3+CD8A+ T II",
               "CD3+CD8A+ T cells III" = "CD3+CD8A+ T III",
               "CD3+CD4+ T Cells I" = "CD3+CD4+ T I", 
               "CD3+CD4+ T Cells II" = "CD3+CD4+ T II", 
               "CD3+ Regulatory T Cells" = "CD3 Tregs", 
               "CD34+ Endothelial Cells I" = "CD34+ EC I", 
               "CD34+ Endothelial Cells II" = "CD34+ EC II", 
               "Mixed Cells I" = "Mixed I", 
               "Mixed Cells II" = "Mixed II", 
               "ACTA2+ Smooth Muscle Cells" = "ACTA2+ SMC", 
               "NCAM1+ Natural Killer Cells" = "NCAM1+ NK", 
               "KIT+ Mast Cells" = "KIT+ MC",
               "CD79A+ B Cells I" = "CD79A+ B I", 
               "CD79A+ B Cells II" = "CD79A+ B II")

scRNAseqData <- Seurat::RenameIdents(object = scRNAseqData, 
                                       celltypes)
UMAPPlot(scRNAseqData, label = TRUE, pt.size = 1.25, label.size = 4, group.by = "ident",
         repel = TRUE)

3.2 Clinical data

Loading Athero-Express clinical data.

require(haven)

# AEDB <- haven::read_sav(paste0(AEDB_loc, "/2019-3NEW_AtheroExpressDatabase_ScientificAE_02072019_IC_added.sav"))
# AEDB <- haven::read_sav(paste0(AEDB_loc, "/2020_1_NEW_AtheroExpressDatabase_ScientificAE_16-03-2020.sav"))
AEDB <- haven::read_sav(paste0(AEDB_loc, "/2021_1_NEW_AtheroExpressDatabase_ScientificAE_01-02-2021.sav"))
AEDB <- haven::read_sav(paste0(AEDB_loc, "/2021_3_NEW_AtheroExpressDatabase_ScientificAE_10-09-2021.sav"))

3.2.1 Fixing and creating variables

We need to be very strict in defining symptoms. Therefore we will fix a new variable that groups symptoms at inclusion.

Coding of symptoms is as follows:

  • missing -999
  • Asymptomatic 0
  • TIA 1
  • minor stroke 2
  • Major stroke 3
  • Amaurosis fugax 4
  • Four vessel disease 5
  • Vertebrobasilary TIA 7
  • Retinal infarction 8
  • Symptomatic, but aspecific symtoms 9
  • Contralateral symptomatic occlusion 10
  • retinal infarction 11
  • armclaudication due to occlusion subclavian artery, CEA needed for bypass 12
  • retinal infarction + TIAs 13
  • Ocular ischemic syndrome 14
  • ischemisch glaucoom 15
  • subclavian steal syndrome 16
  • TGA 17

We will group as follows in Symptoms.5G:

  1. Asymptomatic > 0
  2. TIA > 1, 7, 13
  3. Stroke > 2, 3
  4. Ocular > 4, 14, 15
  5. Retinal infarction > 8, 11
  6. Other > 5, 9, 10, 12, 16, 17

We will also group as follows in AsymptSympt:

  1. Asymptomatic > 0
  2. TIA > 1, 7, 13 + Stroke > 2, 3
  3. Ocular > 4, 14, 15 + Retinal infarction > 8, 11 + Other > 5, 9, 10, 12, 16, 17

We will also group as follows in AsymptSympt2G:

  1. Asymptomatic > 0
  2. TIA > 1, 7, 13 + Stroke > 2, 3 Ocular > 4, 14, 15 + Retinal infarction > 8, 11 + Other > 5, 9, 10, 12, 16, 17
# Fix symptoms

attach(AEDB)

AEDB$sympt[is.na(AEDB$sympt)] <- -999

# Symptoms.5G
AEDB[,"Symptoms.5G"] <- NA
# AEDB$Symptoms.5G[sympt == "NA"] <- "Asymptomatic"
AEDB$Symptoms.5G[sympt == -999] <- NA
AEDB$Symptoms.5G[sympt == 0] <- "Asymptomatic"
AEDB$Symptoms.5G[sympt == 1 | sympt == 7 | sympt == 13] <- "TIA"
AEDB$Symptoms.5G[sympt == 2 | sympt == 3] <- "Stroke"
AEDB$Symptoms.5G[sympt == 4 | sympt == 14 | sympt == 15 ] <- "Ocular"
AEDB$Symptoms.5G[sympt == 8 | sympt == 11] <- "Retinal infarction"
AEDB$Symptoms.5G[sympt == 5 | sympt == 9 | sympt == 10 | sympt == 12 | sympt == 16 | sympt == 17] <- "Other"

# AsymptSympt
AEDB[,"AsymptSympt"] <- NA
AEDB$AsymptSympt[sympt == -999] <- NA
AEDB$AsymptSympt[sympt == 0] <- "Asymptomatic"
AEDB$AsymptSympt[sympt == 1 | sympt == 7 | sympt == 13 | sympt == 2 | sympt == 3] <- "Symptomatic"
AEDB$AsymptSympt[sympt == 4 | sympt == 14 | sympt == 15 | sympt == 8 | sympt == 11 | sympt == 5 | sympt == 9 | sympt == 10 | sympt == 12 | sympt == 16 | sympt == 17] <- "Ocular and others"

# AsymptSympt
AEDB[,"AsymptSympt2G"] <- NA
AEDB$AsymptSympt2G[sympt == -999] <- NA
AEDB$AsymptSympt2G[sympt == 0] <- "Asymptomatic"
AEDB$AsymptSympt2G[sympt == 1 | sympt == 7 | sympt == 13 | sympt == 2 | sympt == 3 | sympt == 4 | sympt == 14 | sympt == 15 | sympt == 8 | sympt == 11 | sympt == 5 | sympt == 9 | sympt == 10 | sympt == 12 | sympt == 16 | sympt == 17] <- "Symptomatic"

detach(AEDB)

# table(AEDB$sympt, useNA = "ifany")
# table(AEDB$AsymptSympt2G, useNA = "ifany")
# table(AEDB$Symptoms.5G, useNA = "ifany")
# 
# table(AEDB$AsymptSympt2G, AEDB$sympt, useNA = "ifany")
# table(AEDB$Symptoms.5G, AEDB$sympt, useNA = "ifany")
table(AEDB$AsymptSympt2G, AEDB$Symptoms.5G, useNA = "ifany")
              
               Asymptomatic Ocular Other Retinal infarction Stroke  TIA <NA>
  Asymptomatic          346      0     0                  0      0    0    0
  Symptomatic             0    447   121                 49    761 1070    0
  <NA>                    0      0     0                  0      0    0 1130
# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "sympt", "Symptoms.5G", "AsymptSympt"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# table(AEDB.temp$Symptoms.5G, AEDB.temp$AsymptSympt)
# 
# rm(AEDB.temp)

We will also fix the plaquephenotypes variable.

Coding of symptoms is as follows:

  • missing -999
  • not relevant -888
  • fibrous 1
  • fibroatheromatous 2
  • atheromatous 3

# Fix plaquephenotypes
attach(AEDB)
AEDB[,"OverallPlaquePhenotype"] <- NA
AEDB$OverallPlaquePhenotype[plaquephenotype == -999] <- NA
AEDB$OverallPlaquePhenotype[plaquephenotype == -999] <- NA
AEDB$OverallPlaquePhenotype[plaquephenotype == 1] <- "fibrous"
AEDB$OverallPlaquePhenotype[plaquephenotype == 2] <- "fibroatheromatous"
AEDB$OverallPlaquePhenotype[plaquephenotype == 3] <- "atheromatous"
detach(AEDB)

table(AEDB$OverallPlaquePhenotype)

     atheromatous fibroatheromatous           fibrous 
              593               879              1482 
# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "plaquephenotype", "OverallPlaquePhenotype"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# rm(AEDB.temp)

We will also fix the diabetes status variable. We define diabetes as history of a diagnosis and/or use of glucose-lowering medications.

# Fix diabetes
attach(AEDB)
AEDB[,"DiabetesStatus"] <- NA
AEDB$DiabetesStatus[DM.composite == -999] <- NA
AEDB$DiabetesStatus[DM.composite == 0] <- "Control (no Diabetes Dx/Med)"
AEDB$DiabetesStatus[DM.composite == 1] <- "Diabetes"
detach(AEDB)

table(AEDB$DM.composite)

   0    1 
2882 1033 
table(AEDB$DiabetesStatus)

Control (no Diabetes Dx/Med)                     Diabetes 
                        2882                         1033 
# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "DM.composite", "DiabetesStatus"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# AEDB.temp$DiabetesStatus <- to_factor(AEDB.temp$DiabetesStatus)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# rm(AEDB.temp)

We will also fix the smoking status variable. We are interested in whether someone never, ever or is currently (at the time of inclusion) smoking. This is based on the questionnaire.

  • diet801: are you a smoker?
  • diet802: did you smoke in the past?

We already have some variables indicating smoking status:

  • SmokingReported: patient has reported to smoke.
  • SmokingYearOR: smoking in the year of surgery?
  • SmokerCurrent: currently smoking?
require(labelled)
AEDB$diet801 <- to_factor(AEDB$diet801)
AEDB$diet802 <- to_factor(AEDB$diet802)
AEDB$diet805 <- to_factor(AEDB$diet805)
AEDB$SmokingReported <- to_factor(AEDB$SmokingReported)
AEDB$SmokerCurrent <- to_factor(AEDB$SmokerCurrent)
AEDB$SmokingYearOR <- to_factor(AEDB$SmokingYearOR)

# table(AEDB$diet801)
# table(AEDB$diet802)
# table(AEDB$SmokingReported)
# table(AEDB$SmokerCurrent)
# table(AEDB$SmokingYearOR)
# table(AEDB$SmokingReported, AEDB$SmokerCurrent, useNA = "ifany", dnn = c("Reported smoking", "Current smoker"))
# 
# table(AEDB$diet801, AEDB$diet802, useNA = "ifany", dnn = c("Smoker", "Past smoker"))

cat("\nFixing smoking status.\n")

Fixing smoking status.
attach(AEDB)
AEDB[,"SmokerStatus"] <- NA
AEDB$SmokerStatus[diet802 == "don't know"] <- "Never smoked"
AEDB$SmokerStatus[diet802 == "I still smoke"] <- "Current smoker"
AEDB$SmokerStatus[SmokerCurrent == "no" & diet802 == "no"] <- "Never smoked"
AEDB$SmokerStatus[SmokerCurrent == "no" & diet802 == "yes"] <- "Ex-smoker"
AEDB$SmokerStatus[SmokerCurrent == "yes"] <- "Current smoker"
AEDB$SmokerStatus[SmokerCurrent == "no data available/missing"] <- NA
# AEDB$SmokerStatus[is.na(SmokerCurrent)] <- "Never smoked"
detach(AEDB)

cat("\n* Current smoking status.\n")

* Current smoking status.
table(AEDB$SmokerCurrent,
      useNA = "ifany", 
      dnn = c("Current smoker"))
Current smoker
no data available/missing                        no                       yes                      <NA> 
                        0                      2472                      1377                        75 
cat("\n* Updated smoking status.\n")

* Updated smoking status.
table(AEDB$SmokerStatus,
      useNA = "ifany", 
      dnn = c("Updated smoking status"))
Updated smoking status
Current smoker      Ex-smoker   Never smoked           <NA> 
          1377           1893            416            238 
cat("\n* Comparing to 'SmokerCurrent'.\n")

* Comparing to 'SmokerCurrent'.
table(AEDB$SmokerStatus, AEDB$SmokerCurrent, 
      useNA = "ifany", 
      dnn = c("Updated smoking status", "Current smoker"))
                      Current smoker
Updated smoking status no data available/missing   no  yes <NA>
        Current smoker                         0    0 1377    0
        Ex-smoker                              0 1893    0    0
        Never smoked                           0  416    0    0
        <NA>                                   0  163    0   75
# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "DM.composite", "DiabetesStatus"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# AEDB.temp$DiabetesStatus <- to_factor(AEDB.temp$DiabetesStatus)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# rm(AEDB.temp)

We will also fix the alcohol status variable.


# Fix diabetes
attach(AEDB)
AEDB[,"AlcoholUse"] <- NA
AEDB$AlcoholUse[diet810 == -999] <- NA
AEDB$AlcoholUse[diet810 == 0] <- "No"
AEDB$AlcoholUse[diet810 == 1] <- "Yes"
detach(AEDB)

table(AEDB$AlcoholUse)

  No  Yes 
1295 2440 
# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "diet810", "AlcoholUse"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# AEDB.temp$AlcoholUse <- to_factor(AEDB.temp$AlcoholUse)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# rm(AEDB.temp)

We will also fix a history of CAD, stroke or peripheral intervention status variable. This will be based on CAD_history, Stroke_history, and Peripheral.interv


# Fix diabetes
attach(AEDB)
AEDB[,"MedHx_CVD"] <- NA
AEDB$MedHx_CVD[CAD_history == 0 | Stroke_history == 0 | Peripheral.interv == 0] <- "No"
AEDB$MedHx_CVD[CAD_history == 1 | Stroke_history == 1 | Peripheral.interv == 1] <- "yes"
detach(AEDB)

table(AEDB$CAD_history)

   0    1 
2555 1353 
table(AEDB$Stroke_history)

   0    1 
2858  982 
table(AEDB$Peripheral.interv)

   0    1 
2709 1186 
table(AEDB$MedHx_CVD)

  No  yes 
1305 2609 
# AEDB.temp <- subset(AEDB,  select = c("STUDY_NUMBER", "UPID", "Age", "Gender", "Hospital", "Artery_summary", "diet810", "AlcoholUse"))
# require(labelled)
# AEDB.temp$Gender <- to_factor(AEDB.temp$Gender)
# AEDB.temp$Hospital <- to_factor(AEDB.temp$Hospital)
# AEDB.temp$Artery_summary <- to_factor(AEDB.temp$Artery_summary)
# AEDB.temp$AlcoholUse <- to_factor(AEDB.temp$AlcoholUse)
# 
# DT::datatable(AEDB.temp[1:10,], caption = "Excerpt of the whole AEDB.", rownames = FALSE)
# 
# rm(AEDB.temp)

We will also fix and inverse-rank normal transform the continuous (manually) scored plaque phenotypes.

AEDB$macmean0 <- as.numeric(AEDB$macmean0)
AEDB$smcmean0 <- as.numeric(AEDB$smcmean0)
AEDB$neutrophils <- as.numeric(AEDB$neutrophils)
AEDB$Mast_cells_plaque <- as.numeric(AEDB$Mast_cells_plaque)
AEDB$vessel_density_averaged <- as.numeric(AEDB$vessel_density_averaged)

AEDB$MAC_rankNorm <- qnorm((rank(AEDB$macmean0, na.last = "keep") - 0.5) / sum(!is.na(AEDB$macmean0)))
AEDB$SMC_rankNorm <- qnorm((rank(AEDB$smcmean0, na.last = "keep") - 0.5) / sum(!is.na(AEDB$smcmean0)))
AEDB$Neutrophils_rankNorm <- qnorm((rank(AEDB$neutrophils, na.last = "keep") - 0.5) / sum(!is.na(AEDB$neutrophils)))
AEDB$MastCells_rankNorm <- qnorm((rank(AEDB$Mast_cells_plaque, na.last = "keep") - 0.5) / sum(!is.na(AEDB$Mast_cells_plaque)))
AEDB$VesselDensity_rankNorm <- qnorm((rank(AEDB$vessel_density_averaged, na.last = "keep") - 0.5) / sum(!is.na(AEDB$vessel_density_averaged)))
library(labelled)
AEDB$Gender <- to_factor(AEDB$Gender)
ggpubr::gghistogram(AEDB, "macmean0", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "% of macrophages (CD68)",
                    xlab = "% per region of interest", 
                    ggtheme = theme_minimal())
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.
Warning: Removed 1361 rows containing non-finite values (stat_bin).

ggpubr::gghistogram(AEDB, "MAC_rankNorm", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "% of macrophages (CD68)",
                   xlab = "% per region of interest\ninverse-rank normalized number", 
                    ggtheme = theme_minimal())
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.
Warning: Removed 1361 rows containing non-finite values (stat_bin).

ggpubr::gghistogram(AEDB, "smcmean0", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "% of smooth muscle cells (SMA)",
                    xlab = "% per region of interest", 
                    ggtheme = theme_minimal())
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.
Warning: Removed 1363 rows containing non-finite values (stat_bin).

ggpubr::gghistogram(AEDB, "SMC_rankNorm", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "% of smooth muscle cells (SMA)",
                   xlab = "% per region of interest\ninverse-rank normalized number", 
                    ggtheme = theme_minimal())
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.
Warning: Removed 1363 rows containing non-finite values (stat_bin).

ggpubr::gghistogram(AEDB, "neutrophils", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "number of neutrophils (CD66b)",
                    xlab = "counts per plaque", 
                    ggtheme = theme_minimal())
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.
Warning: Removed 3583 rows containing non-finite values (stat_bin).

ggpubr::gghistogram(AEDB, "Neutrophils_rankNorm", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "number of neutrophils (CD66b)",
                   xlab = "counts per plaque\ninverse-rank normalized number", 
                    ggtheme = theme_minimal())
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.
Warning: Removed 3583 rows containing non-finite values (stat_bin).

ggpubr::gghistogram(AEDB, "Mast_cells_plaque", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "number of mast cells",
                    xlab = "counts per plaque", 
                    ggtheme = theme_minimal())
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.
Warning: Removed 3660 rows containing non-finite values (stat_bin).

ggpubr::gghistogram(AEDB, "MastCells_rankNorm", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "number of mast cells",
                   xlab = "counts per plaque\ninverse-rank normalized number", 
                    ggtheme = theme_minimal())
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.
Warning: Removed 3660 rows containing non-finite values (stat_bin).

ggpubr::gghistogram(AEDB, "vessel_density_averaged", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "number of intraplaque neovessels",
                    xlab = "counts per 3-4 hotspots", 
                    ggtheme = theme_minimal())
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.
Warning: Removed 1954 rows containing non-finite values (stat_bin).

ggpubr::gghistogram(AEDB, "VesselDensity_rankNorm", 
                    # y = "..count..", 
                    color = "white",
                    fill = "Gender",
                    palette = c("#1290D9", "#DB003F"), 
                    add = "median", 
                    #add_density = TRUE,
                    rug = TRUE,
                    #add.params =  list(color = "black", linetype = 2), 
                    title = "number of intraplaque neovessels",
                   xlab = "counts per 3-4 hotspots\ninverse-rank normalized number", 
                    ggtheme = theme_minimal())
Warning: Using `bins = 30` by default. Pick better value with the argument `bins`.
Warning: Removed 1954 rows containing non-finite values (stat_bin).

Here we calculate the plaque instability/vulnerability index

# Plaque vulnerability
require(labelled)
AEDB$Macrophages.bin <- to_factor(AEDB$Macrophages.bin)
AEDB$SMC.bin <- to_factor(AEDB$SMC.bin)
AEDB$IPH.bin <- to_factor(AEDB$IPH.bin)
AEDB$Calc.bin <- to_factor(AEDB$Calc.bin)
AEDB$Collagen.bin <- to_factor(AEDB$Collagen.bin)
AEDB$Fat.bin_10 <- to_factor(AEDB$Fat.bin_10)
AEDB$Fat.bin_40 <- to_factor(AEDB$Fat.bin_40)

table(AEDB$Macrophages.bin)

      no/minor moderate/heavy 
          1607           1220 
table(AEDB$Fat.bin_10)

 <10%  >10% 
 1270  1708 
table(AEDB$Collagen.bin)

      no/minor moderate/heavy 
           541           2306 
table(AEDB$SMC.bin)

      no/minor moderate/heavy 
           874           1968 
table(AEDB$IPH.bin)

  no  yes 
1223 1628 
# SPSS code

# 
# *** syntax- Plaque vulnerability**.
# COMPUTE Macro_instab = -999.
# IF macrophages.bin=2 Macro_instab=1.
# IF macrophages.bin=1 Macro_instab=0.
# EXECUTE.
# 
# COMPUTE Fat10_instab = -999.
# IF Fat.bin_10=2 Fat10_instab=1.
# IF Fat.bin_10=1 Fat10_instab=0.
# EXECUTE.
# 
# COMPUTE coll_instab=-999.
# IF Collagen.bin=2 coll_instab=0.
# IF Collagen.bin=1 coll_instab=1.
# EXECUTE.
# 
# 
# COMPUTE SMC_instab=-999.
# IF SMC.bin=2 SMC_instab=0.
# IF SMC.bin=1 SMC_instab=1.
# EXECUTE.
# 
# COMPUTE IPH_instab=-999.
# IF IPH.bin=0 IPH_instab=0.
# IF IPH.bin=1 IPH_instab=1.
# EXECUTE.
# 
# COMPUTE Instability=Macro_instab + Fat10_instab +  coll_instab + SMC_instab + IPH_instab.
# EXECUTE.

# Fix plaquephenotypes
attach(AEDB)
# mac instability
AEDB[,"MAC_Instability"] <- NA
AEDB$MAC_Instability[Macrophages.bin == -999] <- NA
AEDB$MAC_Instability[Macrophages.bin == "no/minor"] <- 0
AEDB$MAC_Instability[Macrophages.bin == "moderate/heavy"] <- 1

# fat instability
AEDB[,"FAT10_Instability"] <- NA
AEDB$FAT10_Instability[Fat.bin_10 == -999] <- NA
AEDB$FAT10_Instability[Fat.bin_10 == " <10%"] <- 0
AEDB$FAT10_Instability[Fat.bin_10 == " >10%"] <- 1

# col instability 
AEDB[,"COL_Instability"] <- NA
AEDB$COL_Instability[Collagen.bin == -999] <- NA
AEDB$COL_Instability[Collagen.bin == "no/minor"] <- 1
AEDB$COL_Instability[Collagen.bin == "moderate/heavy"] <- 0

# smc instability
AEDB[,"SMC_Instability"] <- NA
AEDB$SMC_Instability[SMC.bin == -999] <- NA
AEDB$SMC_Instability[SMC.bin == "no/minor"] <- 1
AEDB$SMC_Instability[SMC.bin == "moderate/heavy"] <- 0

# iph instability
AEDB[,"IPH_Instability"] <- NA
AEDB$IPH_Instability[IPH.bin == -999] <- NA
AEDB$IPH_Instability[IPH.bin == "no"] <- 0
AEDB$IPH_Instability[IPH.bin == "yes"] <- 1

detach(AEDB)

table(AEDB$MAC_Instability, useNA = "ifany")

   0    1 <NA> 
1607 1220 1097 
table(AEDB$FAT10_Instability, useNA = "ifany")

   0    1 <NA> 
1270 1708  946 
table(AEDB$COL_Instability, useNA = "ifany")

   0    1 <NA> 
2306  541 1077 
table(AEDB$SMC_Instability, useNA = "ifany")

   0    1 <NA> 
1968  874 1082 
table(AEDB$IPH_Instability, useNA = "ifany")

   0    1 <NA> 
1223 1628 1073 
# creating vulnerability index
AEDB <- AEDB %>% mutate(Plaque_Vulnerability_Index = factor(rowSums(.[grep("_Instability", names(.))], na.rm = TRUE)),
                                )
mutate: new variable 'Plaque_Vulnerability_Index' (factor) with 6 unique values and 0% NA
table(AEDB$Plaque_Vulnerability_Index, useNA = "ifany")

   0    1    2    3    4    5 
1375  732  730  679  298  110 
# str(AEDB$Plaque_Vulnerability_Index)

3.3 Athero-Express Biobank Study

3.3.1 Prepare baseline summary

We are interested in the following variables at baseline.

  • Age (years)

  • Female sex (N, %)

  • Hypertension (N, %)

  • SBP (mmHg)

  • DBP (mmHg)

  • Diabetes mellitus (N, %)

  • Total cholesterol levels (mg/dL)

  • LDL cholesterol levels (mg/dL)

  • HDL cholesterol levels (mg/dL)

  • Triglyceride levels (mg/dL)

  • Use of statins (N, %)

  • Use of antiplatelet drugs (N, %)

  • BMI (kg/m²)

  • Smoking status (N, %)

    • Never smokers
    • Ex-smokers
    • Current smokers
  • History of CAD (N, %)

  • History of PAD (N, %)

  • Clinical manifestations

    • Asymptomatic
    • Amaurosis fugax
    • TIA
    • Stroke
  • eGFR (mL/min/1.73 m²)

  • stenosis

  • year of surgery

  • plaque characteristics

cat("===========================================================================================\n")
===========================================================================================
cat("CREATE BASELINE TABLE\n")
CREATE BASELINE TABLE
# Baseline table variables
basetable_vars = c("Hospital", "ORyear",
                   "Age", "Gender", 
                   "TC_finalCU", "LDL_finalCU", "HDL_finalCU", "TG_finalCU", 
                   "TC_final", "LDL_final", "HDL_final", "TG_final", 
                   "systolic", "diastoli", "GFR_MDRD", "BMI", 
                   "KDOQI", "BMI_WHO",
                   "SmokerStatus", "AlcoholUse",
                   "DiabetesStatus", 
                   "Hypertension.selfreport", "Hypertension.selfreportdrug", "Hypertension.composite", "Hypertension.drugs", 
                   "Med.anticoagulants", "Med.all.antiplatelet", "Med.Statin.LLD", 
                   "Stroke_Dx", "sympt", "Symptoms.5G", "AsymptSympt", 
                   "restenos", "stenose",
                   "MedHx_CVD", "CAD_history", "PAOD", "Peripheral.interv", 
                   "EP_composite", "EP_composite_time",
                   "macmean0", "smcmean0", "Macrophages.bin", "SMC.bin",
                   "neutrophils", "Mast_cells_plaque",
                   "IPH.bin", "vessel_density_averaged",
                   "Calc.bin", "Collagen.bin", 
                   "Fat.bin_10", "Fat.bin_40", "OverallPlaquePhenotype",
                   "SMC_rankNorm", "MAC_rankNorm", "Neutrophils_rankNorm", "MastCells_rankNorm", "VesselDensity_rankNorm")

basetable_bin = c("Gender", 
                  "KDOQI", "BMI_WHO",
                  "SmokerStatus", "AlcoholUse",
                  "DiabetesStatus", 
                  "Hypertension.selfreport", "Hypertension.selfreportdrug", "Hypertension.composite", "Hypertension.drugs", 
                  "Med.anticoagulants", "Med.all.antiplatelet", "Med.Statin.LLD", 
                  "Stroke_Dx", "sympt", "Symptoms.5G", "AsymptSympt", 
                  "restenos", "stenose",
                  "CAD_history", "PAOD", "Peripheral.interv", 
                  "EP_composite", "Macrophages.bin", "SMC.bin",
                  "IPH.bin", 
                  "Calc.bin", "Collagen.bin", 
                  "Fat.bin_10", "Fat.bin_40", "OverallPlaquePhenotype")
# basetable_bin

basetable_con = basetable_vars[!basetable_vars %in% basetable_bin]
# basetable_con

3.3.2 All patients

Showing the baseline table of the whole Athero-Express Biobank.

# Create baseline tables
# http://rstudio-pubs-static.s3.amazonaws.com/13321_da314633db924dc78986a850813a50d5.html
AEDB.tableOne = print(CreateTableOne(vars = basetable_vars, 
                                         # factorVars = basetable_bin,
                                         # strata = "Symptoms.4g",
                                         data = AEDB.full, includeNA = TRUE), 
                          nonnormal = c(), missing = TRUE,
                          quote = FALSE, noSpaces = FALSE, showAllLevels = TRUE, explain = TRUE, 
                          format = "pf", 
                          contDigits = 3)[,1:3]
                                      
                                       level                                                                     Overall           Missing
  n                                                                                                                 3587                  
  Hospital % (freq)                    St. Antonius, Nieuwegein                                                     43.7 (1567)     0.0   
                                       UMC Utrecht                                                                  56.3 (2020)           
  ORyear % (freq)                      No data available/missing                                                     0.0 (   0)     0.0   
                                       2002                                                                          2.4 (  86)           
                                       2003                                                                          5.3 ( 191)           
                                       2004                                                                          7.4 ( 265)           
                                       2005                                                                          7.7 ( 276)           
                                       2006                                                                          7.1 ( 254)           
                                       2007                                                                          5.7 ( 206)           
                                       2008                                                                          5.3 ( 190)           
                                       2009                                                                          6.9 ( 246)           
                                       2010                                                                          7.8 ( 278)           
                                       2011                                                                          6.8 ( 243)           
                                       2012                                                                          7.9 ( 284)           
                                       2013                                                                          6.6 ( 235)           
                                       2014                                                                          7.8 ( 281)           
                                       2015                                                                          2.1 (  77)           
                                       2016                                                                          3.4 ( 121)           
                                       2017                                                                          2.3 (  81)           
                                       2018                                                                          2.3 (  82)           
                                       2019                                                                          2.4 (  85)           
                                       2020                                                                          1.9 (  68)           
                                       2021                                                                          1.1 (  38)           
  Age (mean (SD))                                                                                                 68.796 (9.197)    0.0   
  Gender % (freq)                      female                                                                       29.7 (1067)     0.0   
                                       male                                                                         70.3 (2520)           
  TC_finalCU (mean (SD))                                                                                         186.441 (105.068) 45.8   
  LDL_finalCU (mean (SD))                                                                                        106.593 (45.978)  53.2   
  HDL_finalCU (mean (SD))                                                                                         46.639 (16.721)  50.0   
  TG_finalCU (mean (SD))                                                                                         154.634 (98.415)  50.8   
  TC_final (mean (SD))                                                                                             4.829 (2.721)   45.8   
  LDL_final (mean (SD))                                                                                            2.761 (1.191)   53.2   
  HDL_final (mean (SD))                                                                                            1.208 (0.433)   50.0   
  TG_final (mean (SD))                                                                                             1.747 (1.112)   50.8   
  systolic (mean (SD))                                                                                           150.433 (24.795)  12.7   
  diastoli (mean (SD))                                                                                            79.894 (22.126)  12.7   
  GFR_MDRD (mean (SD))                                                                                            75.175 (24.580)   5.8   
  BMI (mean (SD))                                                                                                 26.433 (4.113)    3.7   
  KDOQI % (freq)                       No data available/missing                                                     0.0 (   0)     5.8   
                                       Normal kidney function                                                       22.4 ( 803)           
                                       CKD 2 (Mild)                                                                 48.0 (1721)           
                                       CKD 3 (Moderate)                                                             21.7 ( 779)           
                                       CKD 4 (Severe)                                                                1.5 (  53)           
                                       CKD 5 (Failure)                                                               0.6 (  22)           
                                       <NA>                                                                          5.8 ( 209)           
  BMI_WHO % (freq)                     No data available/missing                                                     0.0 (   0)     3.7   
                                       Underweight                                                                   1.1 (  40)           
                                       Normal                                                                       36.1 (1296)           
                                       Overweight                                                                   44.2 (1584)           
                                       Obese                                                                        14.9 ( 533)           
                                       <NA>                                                                          3.7 ( 134)           
  SmokerStatus % (freq)                Current smoker                                                               34.9 (1252)     4.3   
                                       Ex-smoker                                                                    50.1 (1796)           
                                       Never smoked                                                                 10.7 ( 384)           
                                       <NA>                                                                          4.3 ( 155)           
  AlcoholUse % (freq)                  No                                                                           32.6 (1171)     3.4   
                                       Yes                                                                          64.0 (2294)           
                                       <NA>                                                                          3.4 ( 122)           
  DiabetesStatus % (freq)              Control (no Diabetes Dx/Med)                                                 73.9 (2651)     0.2   
                                       Diabetes                                                                     25.9 ( 928)           
                                       <NA>                                                                          0.2 (   8)           
  Hypertension.selfreport % (freq)     No data available/missing                                                     0.0 (   0)     2.6   
                                       no                                                                           23.8 ( 854)           
                                       yes                                                                          73.6 (2640)           
                                       <NA>                                                                          2.6 (  93)           
  Hypertension.selfreportdrug % (freq) No data available/missing                                                     0.0 (   0)     3.8   
                                       no                                                                           29.0 (1039)           
                                       yes                                                                          67.3 (2413)           
                                       <NA>                                                                          3.8 ( 135)           
  Hypertension.composite % (freq)      No data available/missing                                                     0.0 (   0)     0.3   
                                       no                                                                           13.7 ( 493)           
                                       yes                                                                          85.9 (3082)           
                                       <NA>                                                                          0.3 (  12)           
  Hypertension.drugs % (freq)          No data available/missing                                                     0.0 (   0)     0.6   
                                       no                                                                           21.2 ( 759)           
                                       yes                                                                          78.2 (2805)           
                                       <NA>                                                                          0.6 (  23)           
  Med.anticoagulants % (freq)          No data available/missing                                                     0.0 (   0)     1.0   
                                       no                                                                           86.4 (3098)           
                                       yes                                                                          12.7 ( 454)           
                                       <NA>                                                                          1.0 (  35)           
  Med.all.antiplatelet % (freq)        No data available/missing                                                     0.0 (   0)     0.8   
                                       no                                                                           13.4 ( 482)           
                                       yes                                                                          85.8 (3078)           
                                       <NA>                                                                          0.8 (  27)           
  Med.Statin.LLD % (freq)              No data available/missing                                                     0.0 (   0)     0.7   
                                       no                                                                           20.9 ( 748)           
                                       yes                                                                          78.5 (2815)           
                                       <NA>                                                                          0.7 (  24)           
  Stroke_Dx % (freq)                   Missing                                                                       0.0 (   0)     5.3   
                                       No stroke diagnosed                                                          77.3 (2771)           
                                       Stroke diagnosed                                                             17.5 ( 626)           
                                       <NA>                                                                          5.3 ( 190)           
  sympt % (freq)                       missing                                                                      28.1 (1008)     0.0   
                                       Asymptomatic                                                                  9.1 ( 327)           
                                       TIA                                                                          27.7 ( 992)           
                                       minor stroke                                                                 11.4 ( 408)           
                                       Major stroke                                                                  7.3 ( 263)           
                                       Amaurosis fugax                                                              11.2 ( 401)           
                                       Four vessel disease                                                           1.1 (  39)           
                                       Vertebrobasilary TIA                                                          0.1 (   5)           
                                       Retinal infarction                                                            1.0 (  37)           
                                       Symptomatic, but aspecific symtoms                                            1.6 (  59)           
                                       Contralateral symptomatic occlusion                                           0.3 (  11)           
                                       retinal infarction                                                            0.3 (   9)           
                                       armclaudication due to occlusion subclavian artery, CEA needed for bypass     0.0 (   1)           
                                       retinal infarction + TIAs                                                     0.0 (   0)           
                                       Ocular ischemic syndrome                                                      0.7 (  25)           
                                       ischemisch glaucoom                                                           0.0 (   0)           
                                       subclavian steal syndrome                                                     0.1 (   2)           
                                       TGA                                                                           0.0 (   0)           
  Symptoms.5G % (freq)                 Asymptomatic                                                                  9.1 ( 327)    28.1   
                                       Ocular                                                                       11.9 ( 426)           
                                       Other                                                                         3.1 ( 112)           
                                       Retinal infarction                                                            1.3 (  46)           
                                       Stroke                                                                       18.7 ( 671)           
                                       TIA                                                                          27.8 ( 997)           
                                       <NA>                                                                         28.1 (1008)           
  AsymptSympt % (freq)                 Asymptomatic                                                                  9.1 ( 327)    28.1   
                                       Ocular and others                                                            16.3 ( 584)           
                                       Symptomatic                                                                  46.5 (1668)           
                                       <NA>                                                                         28.1 (1008)           
  restenos % (freq)                    missing                                                                       0.0 (   0)     3.8   
                                       de novo                                                                      86.9 (3117)           
                                       restenosis                                                                    9.1 ( 328)           
                                       stenose bij angioseal na PTCA                                                 0.1 (   5)           
                                       <NA>                                                                          3.8 ( 137)           
  stenose % (freq)                     missing                                                                       0.0 (   0)     6.5   
                                       0-49%                                                                         0.7 (  24)           
                                       50-70%                                                                        7.1 ( 255)           
                                       70-90%                                                                       36.0 (1290)           
                                       90-99%                                                                       30.1 (1079)           
                                       100% (Occlusion)                                                             14.1 ( 504)           
                                       NA                                                                            0.1 (   3)           
                                       50-99%                                                                        2.5 (  89)           
                                       70-99%                                                                        3.0 ( 107)           
                                       99                                                                            0.1 (   2)           
                                       <NA>                                                                          6.5 ( 234)           
  MedHx_CVD % (freq)                   No                                                                           33.5 (1202)     0.3   
                                       yes                                                                          66.2 (2376)           
                                       <NA>                                                                          0.3 (   9)           
  CAD_history % (freq)                 Missing                                                                       0.0 (   0)     0.3   
                                       No history CAD                                                               65.2 (2338)           
                                       History CAD                                                                  34.5 (1237)           
                                       <NA>                                                                          0.3 (  12)           
  PAOD % (freq)                        missing/no data                                                               0.0 (   0)     0.3   
                                       no                                                                           56.6 (2031)           
                                       yes                                                                          43.1 (1547)           
                                       <NA>                                                                          0.3 (   9)           
  Peripheral.interv % (freq)           no                                                                           69.0 (2476)     0.6   
                                       yes                                                                          30.4 (1090)           
                                       <NA>                                                                          0.6 (  21)           
  EP_composite % (freq)                No data available.                                                            0.0 (   0)     5.2   
                                       No composite endpoints                                                       62.9 (2258)           
                                       Composite endpoints                                                          31.9 (1143)           
                                       <NA>                                                                          5.2 ( 186)           
  EP_composite_time (mean (SD))                                                                                    2.340 (1.181)    5.5   
  macmean0 (mean (SD))                                                                                             0.659 (1.159)   35.3   
  smcmean0 (mean (SD))                                                                                             2.185 (2.698)   35.3   
  Macrophages.bin % (freq)             no/minor                                                                     40.1 (1440)    28.8   
                                       moderate/heavy                                                               31.1 (1114)           
                                       <NA>                                                                         28.8 (1033)           
  SMC.bin % (freq)                     no/minor                                                                     22.3 ( 801)    28.4   
                                       moderate/heavy                                                               49.2 (1766)           
                                       <NA>                                                                         28.4 (1020)           
  neutrophils (mean (SD))                                                                                        144.084 (415.728) 91.3   
  Mast_cells_plaque (mean (SD))                                                                                  164.399 (163.438) 93.2   
  IPH.bin % (freq)                     no                                                                           30.6 (1099)    28.0   
                                       yes                                                                          41.3 (1483)           
                                       <NA>                                                                         28.0 (1005)           
  vessel_density_averaged (mean (SD))                                                                              8.075 (6.275)   50.2   
  Calc.bin % (freq)                    no/minor                                                                     38.6 (1384)    24.6   
                                       moderate/heavy                                                               36.8 (1319)           
                                       <NA>                                                                         24.6 ( 884)           
  Collagen.bin % (freq)                no/minor                                                                     13.9 ( 497)    28.3   
                                       moderate/heavy                                                               57.8 (2075)           
                                       <NA>                                                                         28.3 (1015)           
  Fat.bin_10 % (freq)                   <10%                                                                        31.7 (1136)    24.6   
                                        >10%                                                                        43.7 (1567)           
                                       <NA>                                                                         24.6 ( 884)           
  Fat.bin_40 % (freq)                  <40%                                                                         59.4 (2132)    24.6   
                                       >40%                                                                         15.9 ( 571)           
                                       <NA>                                                                         24.6 ( 884)           
  OverallPlaquePhenotype % (freq)      atheromatous                                                                 15.3 ( 550)    25.3   
                                       fibroatheromatous                                                            22.5 ( 806)           
                                       fibrous                                                                      36.9 (1324)           
                                       <NA>                                                                         25.3 ( 907)           
  SMC_rankNorm (mean (SD))                                                                                        -0.003 (1.004)   35.3   
  MAC_rankNorm (mean (SD))                                                                                         0.004 (0.993)   35.3   
  Neutrophils_rankNorm (mean (SD))                                                                                 0.010 (0.953)   91.3   
  MastCells_rankNorm (mean (SD))                                                                                  -0.009 (1.000)   93.2   
  VesselDensity_rankNorm (mean (SD))                                                                               0.017 (0.978)   50.2   

3.3.3 CEA patients

# Create baseline tables
# http://rstudio-pubs-static.s3.amazonaws.com/13321_da314633db924dc78986a850813a50d5.html
AEDB.CEA.tableOne = print(CreateTableOne(vars = basetable_vars, 
                                         # factorVars = basetable_bin,
                                         # strata = "Symptoms.4g",
                                         data = AEDB.CEA, includeNA = TRUE), 
                          nonnormal = c(), missing = TRUE,
                          quote = FALSE, noSpaces = FALSE, showAllLevels = TRUE, explain = TRUE, 
                          format = "pf", 
                          contDigits = 3)[,1:3]
                                      
                                       level                                                                     Overall           Missing
  n                                                                                                                 2533                  
  Hospital % (freq)                    St. Antonius, Nieuwegein                                                     37.5 ( 951)     0.0   
                                       UMC Utrecht                                                                  62.5 (1582)           
  ORyear % (freq)                      No data available/missing                                                     0.0 (   0)     0.0   
                                       2002                                                                          3.2 (  81)           
                                       2003                                                                          6.2 ( 157)           
                                       2004                                                                          7.5 ( 190)           
                                       2005                                                                          7.3 ( 186)           
                                       2006                                                                          7.2 ( 183)           
                                       2007                                                                          6.0 ( 152)           
                                       2008                                                                          5.5 ( 139)           
                                       2009                                                                          7.2 ( 183)           
                                       2010                                                                          6.3 ( 159)           
                                       2011                                                                          6.5 ( 165)           
                                       2012                                                                          7.1 ( 179)           
                                       2013                                                                          5.9 ( 150)           
                                       2014                                                                          6.5 ( 164)           
                                       2015                                                                          3.0 (  76)           
                                       2016                                                                          3.4 (  85)           
                                       2017                                                                          2.6 (  66)           
                                       2018                                                                          2.7 (  69)           
                                       2019                                                                          2.6 (  65)           
                                       2020                                                                          2.2 (  55)           
                                       2021                                                                          1.1 (  29)           
  Age (mean (SD))                                                                                                 69.167 (9.287)    0.0   
  Gender % (freq)                      female                                                                       30.6 ( 774)     0.0   
                                       male                                                                         69.4 (1759)           
  TC_finalCU (mean (SD))                                                                                         184.109 (55.942)  38.1   
  LDL_finalCU (mean (SD))                                                                                        107.710 (41.683)  45.4   
  HDL_finalCU (mean (SD))                                                                                         46.464 (16.855)  41.7   
  TG_finalCU (mean (SD))                                                                                         151.857 (91.217)  42.7   
  TC_final (mean (SD))                                                                                             4.768 (1.449)   38.1   
  LDL_final (mean (SD))                                                                                            2.790 (1.080)   45.4   
  HDL_final (mean (SD))                                                                                            1.203 (0.437)   41.7   
  TG_final (mean (SD))                                                                                             1.716 (1.031)   42.7   
  systolic (mean (SD))                                                                                           151.930 (24.994)  11.3   
  diastoli (mean (SD))                                                                                            81.065 (24.738)  11.3   
  GFR_MDRD (mean (SD))                                                                                            73.514 (21.454)   4.1   
  BMI (mean (SD))                                                                                                 26.549 (4.110)    3.8   
  KDOQI % (freq)                       No data available/missing                                                     0.0 (   0)     4.2   
                                       Normal kidney function                                                       19.9 ( 505)           
                                       CKD 2 (Mild)                                                                 51.3 (1299)           
                                       CKD 3 (Moderate)                                                             22.9 ( 579)           
                                       CKD 4 (Severe)                                                                1.3 (  34)           
                                       CKD 5 (Failure)                                                               0.4 (  10)           
                                       <NA>                                                                          4.2 ( 106)           
  BMI_WHO % (freq)                     No data available/missing                                                     0.0 (   0)     3.9   
                                       Underweight                                                                   1.0 (  25)           
                                       Normal                                                                       35.7 ( 905)           
                                       Overweight                                                                   44.0 (1114)           
                                       Obese                                                                        15.4 ( 390)           
                                       <NA>                                                                          3.9 (  99)           
  SmokerStatus % (freq)                Current smoker                                                               33.8 ( 855)     4.6   
                                       Ex-smoker                                                                    48.3 (1224)           
                                       Never smoked                                                                 13.3 ( 338)           
                                       <NA>                                                                          4.6 ( 116)           
  AlcoholUse % (freq)                  No                                                                           34.9 ( 883)     3.6   
                                       Yes                                                                          61.5 (1559)           
                                       <NA>                                                                          3.6 (  91)           
  DiabetesStatus % (freq)              Control (no Diabetes Dx/Med)                                                 76.0 (1925)     0.2   
                                       Diabetes                                                                     23.8 ( 602)           
                                       <NA>                                                                          0.2 (   6)           
  Hypertension.selfreport % (freq)     No data available/missing                                                     0.0 (   0)     2.4   
                                       no                                                                           24.4 ( 618)           
                                       yes                                                                          73.2 (1854)           
                                       <NA>                                                                          2.4 (  61)           
  Hypertension.selfreportdrug % (freq) No data available/missing                                                     0.0 (   0)     3.4   
                                       no                                                                           29.9 ( 758)           
                                       yes                                                                          66.7 (1689)           
                                       <NA>                                                                          3.4 (  86)           
  Hypertension.composite % (freq)      No data available/missing                                                     0.0 (   0)     0.3   
                                       no                                                                           15.0 ( 380)           
                                       yes                                                                          84.7 (2146)           
                                       <NA>                                                                          0.3 (   7)           
  Hypertension.drugs % (freq)          No data available/missing                                                     0.0 (   0)     0.6   
                                       no                                                                           23.6 ( 598)           
                                       yes                                                                          75.8 (1919)           
                                       <NA>                                                                          0.6 (  16)           
  Med.anticoagulants % (freq)          No data available/missing                                                     0.0 (   0)     1.0   
                                       no                                                                           87.7 (2221)           
                                       yes                                                                          11.3 ( 286)           
                                       <NA>                                                                          1.0 (  26)           
  Med.all.antiplatelet % (freq)        No data available/missing                                                     0.0 (   0)     0.8   
                                       no                                                                           12.4 ( 314)           
                                       yes                                                                          86.9 (2200)           
                                       <NA>                                                                          0.8 (  19)           
  Med.Statin.LLD % (freq)              No data available/missing                                                     0.0 (   0)     0.7   
                                       no                                                                           20.0 ( 507)           
                                       yes                                                                          79.3 (2009)           
                                       <NA>                                                                          0.7 (  17)           
  Stroke_Dx % (freq)                   Missing                                                                       0.0 (   0)     4.5   
                                       No stroke diagnosed                                                          73.1 (1851)           
                                       Stroke diagnosed                                                             22.5 ( 569)           
                                       <NA>                                                                          4.5 ( 113)           
  sympt % (freq)                       missing                                                                       0.7 (  17)     0.0   
                                       Asymptomatic                                                                 11.0 ( 279)           
                                       TIA                                                                          38.8 ( 984)           
                                       minor stroke                                                                 16.1 ( 407)           
                                       Major stroke                                                                 10.4 ( 263)           
                                       Amaurosis fugax                                                              15.8 ( 400)           
                                       Four vessel disease                                                           1.5 (  38)           
                                       Vertebrobasilary TIA                                                          0.2 (   5)           
                                       Retinal infarction                                                            1.5 (  37)           
                                       Symptomatic, but aspecific symtoms                                            2.2 (  55)           
                                       Contralateral symptomatic occlusion                                           0.4 (  11)           
                                       retinal infarction                                                            0.4 (   9)           
                                       armclaudication due to occlusion subclavian artery, CEA needed for bypass     0.0 (   1)           
                                       retinal infarction + TIAs                                                     0.0 (   0)           
                                       Ocular ischemic syndrome                                                      1.0 (  25)           
                                       ischemisch glaucoom                                                           0.0 (   0)           
                                       subclavian steal syndrome                                                     0.1 (   2)           
                                       TGA                                                                           0.0 (   0)           
  Symptoms.5G % (freq)                 Asymptomatic                                                                 11.0 ( 279)     0.7   
                                       Ocular                                                                       16.8 ( 425)           
                                       Other                                                                         4.2 ( 107)           
                                       Retinal infarction                                                            1.8 (  46)           
                                       Stroke                                                                       26.5 ( 670)           
                                       TIA                                                                          39.0 ( 989)           
                                       <NA>                                                                          0.7 (  17)           
  AsymptSympt % (freq)                 Asymptomatic                                                                 11.0 ( 279)     0.7   
                                       Ocular and others                                                            22.8 ( 578)           
                                       Symptomatic                                                                  65.5 (1659)           
                                       <NA>                                                                          0.7 (  17)           
  restenos % (freq)                    missing                                                                       0.0 (   0)     1.6   
                                       de novo                                                                      93.5 (2369)           
                                       restenosis                                                                    4.9 ( 124)           
                                       stenose bij angioseal na PTCA                                                 0.0 (   0)           
                                       <NA>                                                                          1.6 (  40)           
  stenose % (freq)                     missing                                                                       0.0 (   0)     2.2   
                                       0-49%                                                                         0.6 (  14)           
                                       50-70%                                                                        7.9 ( 200)           
                                       70-90%                                                                       46.0 (1165)           
                                       90-99%                                                                       38.1 ( 965)           
                                       100% (Occlusion)                                                              1.3 (  34)           
                                       NA                                                                            0.0 (   1)           
                                       50-99%                                                                        0.7 (  17)           
                                       70-99%                                                                        3.2 (  80)           
                                       99                                                                            0.1 (   2)           
                                       <NA>                                                                          2.2 (  55)           
  MedHx_CVD % (freq)                   No                                                                           35.8 ( 908)     0.2   
                                       yes                                                                          64.0 (1620)           
                                       <NA>                                                                          0.2 (   5)           
  CAD_history % (freq)                 Missing                                                                       0.0 (   0)     0.3   
                                       No history CAD                                                               67.9 (1719)           
                                       History CAD                                                                  31.8 ( 806)           
                                       <NA>                                                                          0.3 (   8)           
  PAOD % (freq)                        missing/no data                                                               0.0 (   0)     0.3   
                                       no                                                                           78.6 (1992)           
                                       yes                                                                          21.1 ( 534)           
                                       <NA>                                                                          0.3 (   7)           
  Peripheral.interv % (freq)           no                                                                           78.4 (1986)     0.6   
                                       yes                                                                          21.0 ( 531)           
                                       <NA>                                                                          0.6 (  16)           
  EP_composite % (freq)                No data available.                                                            0.0 (   0)     5.6   
                                       No composite endpoints                                                       70.1 (1775)           
                                       Composite endpoints                                                          24.4 ( 617)           
                                       <NA>                                                                          5.6 ( 141)           
  EP_composite_time (mean (SD))                                                                                    2.490 (1.117)    5.8   
  macmean0 (mean (SD))                                                                                             0.769 (1.186)   32.5   
  smcmean0 (mean (SD))                                                                                             1.982 (2.378)   32.7   
  Macrophages.bin % (freq)             no/minor                                                                     33.7 ( 853)    27.0   
                                       moderate/heavy                                                               39.4 ( 997)           
                                       <NA>                                                                         27.0 ( 683)           
  SMC.bin % (freq)                     no/minor                                                                     24.0 ( 607)    26.7   
                                       moderate/heavy                                                               49.3 (1250)           
                                       <NA>                                                                         26.7 ( 676)           
  neutrophils (mean (SD))                                                                                        146.685 (419.386) 88.0   
  Mast_cells_plaque (mean (SD))                                                                                  164.488 (163.771) 90.4   
  IPH.bin % (freq)                     no                                                                           29.6 ( 749)    26.6   
                                       yes                                                                          43.9 (1111)           
                                       <NA>                                                                         26.6 ( 673)           
  vessel_density_averaged (mean (SD))                                                                              8.322 (6.386)   37.8   
  Calc.bin % (freq)                    no/minor                                                                     41.3 (1045)    24.8   
                                       moderate/heavy                                                               34.0 ( 860)           
                                       <NA>                                                                         24.8 ( 628)           
  Collagen.bin % (freq)                no/minor                                                                     15.2 ( 386)    26.5   
                                       moderate/heavy                                                               58.3 (1476)           
                                       <NA>                                                                         26.5 ( 671)           
  Fat.bin_10 % (freq)                   <10%                                                                        21.9 ( 555)    24.8   
                                        >10%                                                                        53.3 (1351)           
                                       <NA>                                                                         24.8 ( 627)           
  Fat.bin_40 % (freq)                  <40%                                                                         55.1 (1395)    24.8   
                                       >40%                                                                         20.2 ( 511)           
                                       <NA>                                                                         24.8 ( 627)           
  OverallPlaquePhenotype % (freq)      atheromatous                                                                 19.5 ( 495)    25.1   
                                       fibroatheromatous                                                            27.4 ( 694)           
                                       fibrous                                                                      28.0 ( 708)           
                                       <NA>                                                                         25.1 ( 636)           
  SMC_rankNorm (mean (SD))                                                                                        -0.061 (0.962)   32.7   
  MAC_rankNorm (mean (SD))                                                                                         0.179 (0.952)   32.5   
  Neutrophils_rankNorm (mean (SD))                                                                                 0.027 (0.951)   88.0   
  MastCells_rankNorm (mean (SD))                                                                                  -0.010 (1.002)   90.4   
  VesselDensity_rankNorm (mean (SD))                                                                               0.057 (0.981)   37.8   

3.4 Athero-Express Single-Cell RNA Study (AESCRNA)

3.4.1 Baseline summary

metadata <- scRNAseqData@meta.data %>% as_tibble()
scRNAseqDataMeta <- metadata %>% distinct(Patient, .keep_all = TRUE)
distinct: removed 6,154 rows (99%), 37 rows remaining
scRNAseqDataMetaAE <- merge(scRNAseqDataMeta, AEDB, by.x = "Patient", by.y = "STUDY_NUMBER", sort = FALSE, all.x = TRUE)
dim(scRNAseqDataMetaAE)
[1]   37 1216
# Replace missing data 
# Ref: https://cran.r-project.org/web/packages/naniar/vignettes/replace-with-na.html
require(naniar)

na_strings <- c("NA", "N A", "N / A", "N/A", "N/ A", 
                "Not Available", "Not available", 
                "missing", 
                "-999", "-99", 
                "No data available/missing", "No data available/Missing")
# Then you write ~.x %in% na_strings - which reads as “does this value occur in the list of NA strings”.

scRNAseqDataMetaAE %>%
  replace_with_na_all(condition = ~.x %in% na_strings)
cat("====================================================================================================")
====================================================================================================
cat("SELECTION THE SHIZZLE")
SELECTION THE SHIZZLE
cat("- sanity checking PRIOR to selection")
- sanity checking PRIOR to selection
library(data.table)
require(labelled)
ae.gender <- to_factor(scRNAseqDataMetaAE$Gender)
ae.hospital <- to_factor(scRNAseqDataMetaAE$Hospital)
table(ae.gender, ae.hospital, dnn = c("Sex", "Hospital"), useNA = "ifany")
        Hospital
Sex      St. Antonius, Nieuwegein UMC Utrecht
  female                        0          11
  male                          0          26
ae.artery <- to_factor(scRNAseqDataMetaAE$Artery_summary)
table(ae.artery, ae.gender, dnn = c("Sex", "Artery"), useNA = "ifany")
                                                                                         Artery
Sex                                                                                       female male
  No artery known (yet), no surgery (patient ill, died, exited study), re-numbered to AAA      0    0
  carotid (left & right)                                                                      11   25
  femoral/iliac (left, right or both sides)                                                    0    0
  other carotid arteries (common, external)                                                    0    1
  carotid bypass and injury (left, right or both sides)                                        0    0
  aneurysmata (carotid & femoral)                                                              0    0
  aorta                                                                                        0    0
  other arteries (renal, popliteal, vertebral)                                                 0    0
  femoral bypass, angioseal and injury (left, right or both sides)                             0    0
ae.ic <- to_factor(scRNAseqDataMetaAE$informedconsent)
table(ae.ic, ae.gender, useNA = "ifany")
                                                                                                 ae.gender
ae.ic                                                                                             female male
  missing                                                                                              0    0
  no, died                                                                                             0    0
  yes                                                                                                  6   14
  yes, health treatment when possible                                                                  2    7
  yes, no health treatment                                                                             1    2
  yes, no health treatment, no commercial business                                                     1    2
  yes, no tissue, no commerical business                                                               0    0
  yes, no tissue, no questionnaires, no medical info, no commercial business                           0    0
  yes, no questionnaires, no health treatment, no commercial business                                  0    0
  yes, no questionnaires, health treatment when possible                                               0    0
  yes, no tissue, no questionnaires, no health treatment, no commerical business                       0    0
  yes, no health treatment, no medical info, no commercial business                                    0    0
  yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business      0    0
  yes, no questionnaires, no health treatment                                                          0    0
  yes, no tissue, no health treatment                                                                  0    0
  yes, no tissue, no questionnaires                                                                    0    0
  yes, no tissue, health treatment when possible                                                       0    0
  yes, no tissue                                                                                       0    0
  yes, no commerical business                                                                          0    1
  yes, health treatment when possible, no commercial business                                          0    0
  yes, no medical info, no commercial business                                                         0    0
  yes, no questionnaires                                                                               0    0
  yes, no tissue, no questionnaires, no health treatment, no medical info                              0    0
  yes, no tissue, no questionnaires, no health treatment, no commercial business                       0    0
  yes, no medical info                                                                                 0    0
  yes, no questionnaires, no commercial business                                                       0    0
  yes, no questionnaires, no health treatment, no medical info                                         0    0
  yes, no questionnaires, health treatment when possible, no commercial business                       0    0
  yes,  no health treatment, no medical info                                                           0    0
  no, doesn't want to                                                                                  0    0
  no, unable to sign                                                                                   0    0
  no, no reaction                                                                                      0    0
  no, lost                                                                                             0    0
  no, too old                                                                                          0    0
  yes, no medical info, health treatment when possible                                                 1    0
  no (never asked for IC because there was no tissue)                                                  0    0
  yes, no medical info, no commercial business, health treatment when possible                         0    0
  no, endpoint                                                                                         0    0
  wil niets invullen, wel alles gebruiken                                                              0    0
  second informed concents: yes, no commercial business                                                0    0
  nooit geincludeerd                                                                                   0    0
rm(ae.gender, ae.hospital, ae.artery, ae.ic)


scRNAseqDataMetaAE.all <- subset(scRNAseqDataMetaAE,
                            (Artery_summary == "carotid (left & right)" | Artery_summary == "other carotid arteries (common, external)" ) & # we only want carotids
                              informedconsent != "missing" & # we are really strict in selecting based on 'informed consent'!
                              informedconsent != "no, died" &
                              informedconsent != "yes, no tissue, no commerical business" &
                              informedconsent != "yes, no tissue, no questionnaires, no medical info, no commercial business" &
                              informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commerical business" &
                              informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info, no commercial business" &
                              informedconsent != "yes, no tissue, no health treatment" &
                              informedconsent != "yes, no tissue, no questionnaires" &
                              informedconsent != "yes, no tissue, health treatment when possible" &
                              informedconsent != "yes, no tissue" &
                              informedconsent != "yes, no tissue, no questionnaires, no health treatment, no medical info" &
                              informedconsent != "yes, no tissue, no questionnaires, no health treatment, no commercial business" &
                              informedconsent != "no, doesn't want to" &
                              informedconsent != "no, unable to sign" &
                              informedconsent != "no, no reaction" &
                              informedconsent != "no, lost" &
                              informedconsent != "no, too old" &
                              informedconsent != "yes, no medical info, health treatment when possible" & 
                              informedconsent != "no (never asked for IC because there was no tissue)" &
                              informedconsent != "no, endpoint" &
                              informedconsent != "nooit geincludeerd")
# scRNAseqDataMetaAE.all[1:10, 1:10]
dim(scRNAseqDataMetaAE.all)
[1]   36 1216
# DT::datatable(scRNAseqDataMetaAE.all)

Showing the baseline table.

cat("===========================================================================================")
===========================================================================================
cat("CREATE BASELINE TABLE")
CREATE BASELINE TABLE
# Create baseline tables
# http://rstudio-pubs-static.s3.amazonaws.com/13321_da314633db924dc78986a850813a50d5.html
scRNAseqDataMetaAE.all.tableOne = print(CreateTableOne(vars = basetable_vars, 
                                                  # factorVars = basetable_bin,
                                                  # strata = "Gender",
                                                  data = scRNAseqDataMetaAE.all, includeNA = TRUE), 
                                   nonnormal = c(), 
                                   quote = FALSE, showAllLevels = TRUE,
                                   format = "p", 
                                   contDigits = 3)[,1:2]
Warning in ModuleReturnVarsExist(vars, data) :
  These variables only have NA/NaN: macmean0 smcmean0 neutrophils Mast_cells_plaque IPH.bin vessel_density_averaged SMC_rankNorm MAC_rankNorm Neutrophils_rankNorm MastCells_rankNorm VesselDensity_rankNorm  Dropped
                                 
                                  level                                                                     Overall          
  n                                                                                                              36          
  Hospital (%)                    St. Antonius, Nieuwegein                                                      0.0          
                                  UMC Utrecht                                                                 100.0          
  ORyear (%)                      No data available/missing                                                     0.0          
                                  2002                                                                          0.0          
                                  2003                                                                          0.0          
                                  2004                                                                          0.0          
                                  2005                                                                          0.0          
                                  2006                                                                          0.0          
                                  2007                                                                          0.0          
                                  2008                                                                          0.0          
                                  2009                                                                          0.0          
                                  2010                                                                          0.0          
                                  2011                                                                          0.0          
                                  2012                                                                          0.0          
                                  2013                                                                          0.0          
                                  2014                                                                          0.0          
                                  2015                                                                          0.0          
                                  2016                                                                          0.0          
                                  2017                                                                          0.0          
                                  2018                                                                         63.9          
                                  2019                                                                         36.1          
                                  2020                                                                          0.0          
                                  2021                                                                          0.0          
  Age (mean (SD))                                                                                            72.444 (8.255)  
  Gender (%)                      female                                                                       27.8          
                                  male                                                                         72.2          
  TC_finalCU (mean (SD))                                                                                    167.402 (47.126) 
  LDL_finalCU (mean (SD))                                                                                    95.810 (37.936) 
  HDL_finalCU (mean (SD))                                                                                    43.901 (9.974)  
  TG_finalCU (mean (SD))                                                                                    171.001 (107.745)
  TC_final (mean (SD))                                                                                        4.336 (1.221)  
  LDL_final (mean (SD))                                                                                       2.481 (0.983)  
  HDL_final (mean (SD))                                                                                       1.137 (0.258)  
  TG_final (mean (SD))                                                                                        1.932 (1.218)  
  systolic (mean (SD))                                                                                      152.714 (25.400) 
  diastoli (mean (SD))                                                                                       80.229 (15.904) 
  GFR_MDRD (mean (SD))                                                                                       82.126 (31.316) 
  BMI (mean (SD))                                                                                            26.626 (3.689)  
  KDOQI (%)                       No data available/missing                                                     0.0          
                                  Normal kidney function                                                       33.3          
                                  CKD 2 (Mild)                                                                 30.6          
                                  CKD 3 (Moderate)                                                             25.0          
                                  CKD 4 (Severe)                                                                0.0          
                                  CKD 5 (Failure)                                                               0.0          
                                  <NA>                                                                         11.1          
  BMI_WHO (%)                     No data available/missing                                                     0.0          
                                  Underweight                                                                   2.8          
                                  Normal                                                                       33.3          
                                  Overweight                                                                   41.7          
                                  Obese                                                                        16.7          
                                  <NA>                                                                          5.6          
  SmokerStatus (%)                Current smoker                                                               33.3          
                                  Ex-smoker                                                                    50.0          
                                  Never smoked                                                                 13.9          
                                  <NA>                                                                          2.8          
  AlcoholUse (%)                  No                                                                           38.9          
                                  Yes                                                                          55.6          
                                  <NA>                                                                          5.6          
  DiabetesStatus (%)              Control (no Diabetes Dx/Med)                                                 63.9          
                                  Diabetes                                                                     36.1          
  Hypertension.selfreport (%)     No data available/missing                                                     0.0          
                                  no                                                                           11.1          
                                  yes                                                                          86.1          
                                  <NA>                                                                          2.8          
  Hypertension.selfreportdrug (%) No data available/missing                                                     0.0          
                                  no                                                                           11.1          
                                  yes                                                                          86.1          
                                  <NA>                                                                          2.8          
  Hypertension.composite (%)      No data available/missing                                                     0.0          
                                  no                                                                            5.6          
                                  yes                                                                          94.4          
  Hypertension.drugs (%)          No data available/missing                                                     0.0          
                                  no                                                                            5.6          
                                  yes                                                                          91.7          
                                  <NA>                                                                          2.8          
  Med.anticoagulants (%)          No data available/missing                                                     0.0          
                                  no                                                                           88.9          
                                  yes                                                                           5.6          
                                  <NA>                                                                          5.6          
  Med.all.antiplatelet (%)        No data available/missing                                                     0.0          
                                  no                                                                           25.0          
                                  yes                                                                          72.2          
                                  <NA>                                                                          2.8          
  Med.Statin.LLD (%)              No data available/missing                                                     0.0          
                                  no                                                                           19.4          
                                  yes                                                                          77.8          
                                  <NA>                                                                          2.8          
  Stroke_Dx (%)                   Missing                                                                       0.0          
                                  No stroke diagnosed                                                          50.0          
                                  Stroke diagnosed                                                             50.0          
  sympt (%)                       missing                                                                       0.0          
                                  Asymptomatic                                                                 16.7          
                                  TIA                                                                          13.9          
                                  minor stroke                                                                 30.6          
                                  Major stroke                                                                 11.1          
                                  Amaurosis fugax                                                              13.9          
                                  Four vessel disease                                                           0.0          
                                  Vertebrobasilary TIA                                                          0.0          
                                  Retinal infarction                                                            2.8          
                                  Symptomatic, but aspecific symtoms                                            2.8          
                                  Contralateral symptomatic occlusion                                           0.0          
                                  retinal infarction                                                            2.8          
                                  armclaudication due to occlusion subclavian artery, CEA needed for bypass     0.0          
                                  retinal infarction + TIAs                                                     0.0          
                                  Ocular ischemic syndrome                                                      5.6          
                                  ischemisch glaucoom                                                           0.0          
                                  subclavian steal syndrome                                                     0.0          
                                  TGA                                                                           0.0          
  Symptoms.5G (%)                 Asymptomatic                                                                 16.7          
                                  Ocular                                                                       19.4          
                                  Other                                                                         2.8          
                                  Retinal infarction                                                            5.6          
                                  Stroke                                                                       41.7          
                                  TIA                                                                          13.9          
  AsymptSympt (%)                 Asymptomatic                                                                 16.7          
                                  Ocular and others                                                            27.8          
                                  Symptomatic                                                                  55.6          
  restenos (%)                    missing                                                                       0.0          
                                  de novo                                                                     100.0          
                                  restenosis                                                                    0.0          
                                  stenose bij angioseal na PTCA                                                 0.0          
  stenose (%)                     missing                                                                       0.0          
                                  0-49%                                                                         2.8          
                                  50-70%                                                                       16.7          
                                  70-90%                                                                       41.7          
                                  90-99%                                                                       22.2          
                                  100% (Occlusion)                                                              0.0          
                                  NA                                                                            0.0          
                                  50-99%                                                                        0.0          
                                  70-99%                                                                       16.7          
                                  99                                                                            0.0          
  MedHx_CVD (%)                   No                                                                           27.8          
                                  yes                                                                          72.2          
  CAD_history (%)                 Missing                                                                       0.0          
                                  No history CAD                                                               72.2          
                                  History CAD                                                                  27.8          
  PAOD (%)                        missing/no data                                                               0.0          
                                  no                                                                           86.1          
                                  yes                                                                          13.9          
  Peripheral.interv (%)           no                                                                           77.8          
                                  yes                                                                          22.2          
  EP_composite (%)                No data available.                                                            0.0          
                                  No composite endpoints                                                       72.2          
                                  Composite endpoints                                                          11.1          
                                  <NA>                                                                         16.7          
  EP_composite_time (mean (SD))                                                                               1.319 (0.642)  
  Macrophages.bin (%)             no/minor                                                                      2.8          
                                  moderate/heavy                                                                2.8          
                                  <NA>                                                                         94.4          
  SMC.bin (%)                     no/minor                                                                      2.8          
                                  moderate/heavy                                                                2.8          
                                  <NA>                                                                         94.4          
  Calc.bin (%)                    no/minor                                                                      5.6          
                                  moderate/heavy                                                                0.0          
                                  <NA>                                                                         94.4          
  Collagen.bin (%)                no/minor                                                                      0.0          
                                  moderate/heavy                                                                5.6          
                                  <NA>                                                                         94.4          
  Fat.bin_10 (%)                   <10%                                                                         0.0          
                                   >10%                                                                         5.6          
                                  <NA>                                                                         94.4          
  Fat.bin_40 (%)                  <40%                                                                          2.8          
                                  >40%                                                                          2.8          
                                  <NA>                                                                         94.4          
  OverallPlaquePhenotype (%)      atheromatous                                                                  2.8          
                                  fibroatheromatous                                                             2.8          
                                  fibrous                                                                       0.0          
                                  <NA>                                                                         94.4          

3.4.2 Saving baseline for AESCRNA

Writing the baseline table to Excel format.

# Write basetable
require(openxlsx)
write.xlsx(file = paste0(OUT_loc, "/",Today,".",PROJECTNAME,".AE.BaselineTable.scRNAseq.xlsx"),
           format(scRNAseqDataMetaAE.all.tableOne, digits = 5, scientific = FALSE), 
           rowNames = TRUE, colNames = TRUE, overwrite = TRUE)

4 AESCRNA

4.1 Quality control

Here review the number of cells per sample, plate, and patients. And plot the ratio’s per sample and study number.

## check stuff
cat("\nHow many cells per type ...?")

How many cells per type ...?
sort(table(scRNAseqData@meta.data$SCT_snn_res.0.8))

  17   16   15   14   13   12   11   10    9    8    7    6    5    4    3    2    1    0 
  31   34   84  110  151  172  190  203  211  225  290  345  437  534  577  626  861 1110 
cat("\n\nHow many cells per plate ...?")


How many cells per plate ...?
sort(table(scRNAseqData@meta.data$ID))

4530.P1 4440.P1 4472.P1 4478.P1 4477.P1 4500.P1 4458.P1 4459.P1 4447.P2 4447.P3 4487.P2 4502.P1 4455.P1 4496.P1 4501.P1 4447.P1 4489.P1 4476.P1 4448.P1 4487.P1 4571.P1 4495.P1 4432.P1 
      4      11      32      40      41      45      47      48      51      66      75      80      82      88      93      96     102     104     105     112     112     115     129 
4520.P1 4450.P2 4545.P1 4513.P1 4452.P3 4453.P3 4452.P2 4450.P1 4558.P1 4535.P1 4488.P1 4480.P1 4470.P1 4450.P3 4453.P1 4486.P1 4452.P1 4546.P1 4443.P2 4491.P1 4453.P2 4530.P2 4443.P1 
    130     134     135     139     141     143     155     157     157     158     159     161     165     166     177     179     183     188     189     193     197     207     209 
4521.P2 4443.P3 4542.P1 
    212     239     240 
cat("\n\nHow many cells per type per plate ...?")


How many cells per type per plate ...?
table(scRNAseqData@meta.data$SCT_snn_res.0.8, scRNAseqData@meta.data$ID)
    
     4432.P1 4440.P1 4443.P1 4443.P2 4443.P3 4447.P1 4447.P2 4447.P3 4448.P1 4450.P1 4450.P2 4450.P3 4452.P1 4452.P2 4452.P3 4453.P1 4453.P2 4453.P3 4455.P1 4458.P1 4459.P1 4470.P1
  0       28       2      31      56      53       8       7      12      22      15      22      22       5      15      21      19      20      23      10       5       2      44
  1       23       0       0       1       0       0       0       0      27      13      10      11       7      17      14      18      27      17       9       2       9      25
  2       18       1      15      11       8       9       5       4      11      20      23      25       4       8       8       7       4       6      19       8       9      16
  3        2       0       3       4       4       4       3       8       0      27      20      50     134      48      32      42      78      12       2       2       0       2
  4       14       2       5       7       5       2       3       2       6      12       5       5       7      10       6      33      15      19      10       1       2      23
  5       11       3      21      22      28       5       6       5       7       9       4       5       5       6       4      17      14      14       5       6       6       5
  6        1       1      66      46      73      15       1       4       3       4       7       6       4      10      13      18      10      26       3       1       3      20
  7        4       0      14       6       4       8       4       6       3      31      24      10       5       9      14       4       2       5       0       2       1       7
  8        9       0      10       2       5       4       3       7       4       2       5       4       0       2       2       1       3       1       4       2       0       4
  9        3       1       3       2       2       8       5       8       8      14       4       8       2       3       2       0       0       2       1       8       0       0
  10       7       0       5       6       1       2       2       0       2       2       3       6       3       4       2       1       4       2       7       2       2       1
  11       0       1       7       5       2      23      11       8       0       0       5       3       0       8       7       1       2       5       3       2       6       7
  12       4       0       8       7      11       0       0       0       9       0       0       5       3       6       6       2      11       3       3       0       4       7
  13       1       0      20       7      40       6       0       0       1       0       1       1       0       0       1       0       1       0       2       1       1       2
  14       1       0       0       1       1       1       0       1       1       5       1       3       1       2       6       4       3       1       2       3       0       0
  15       0       0       1       5       1       1       1       1       0       1       0       1       3       6       2       4       3       3       1       2       1       2
  16       1       0       0       0       1       0       0       0       0       0       0       0       0       0       1       2       0       3       0       0       2       0
  17       2       0       0       1       0       0       0       0       1       2       0       1       0       1       0       4       0       1       1       0       0       0
    
     4472.P1 4476.P1 4477.P1 4478.P1 4480.P1 4486.P1 4487.P1 4487.P2 4488.P1 4489.P1 4491.P1 4495.P1 4496.P1 4500.P1 4501.P1 4502.P1 4513.P1 4520.P1 4521.P2 4530.P1 4530.P2 4535.P1
  0        1      10      11       7      15      38      15       5      28      30      38      12       7       9      28      25      29      23      43       0      29      32
  1        5      21      12       7      51      21      27      21      44      20      51      29       9       4      28      17      24      20      48       1      12      24
  2       10       8       2       6      16      31      18      11      10       4      11      14      49       5      10       1       9      13      13       1      72      12
  3        0       7       0       1       3       7       0      14       1       0       1       2       3       6       3       2       2       7      14       1       9       1
  4        0       7       2       1       1       7       1       2       4      11      16      15       3       3       2      17      29       8      32       0      17      45
  5        3      13       1       5      17       5      11       4       8       4      22      14       4       8       3       5      17       7      14       1      18      12
  6        0       0       0       0       0       1       9       0       0       0       0       0       0       0       0       0       0       0       0       0       0       0
  7        3       3       0       1      12      19       5       0      18       4       2       3       1       1       3       0       1       1       0       0       3       1
  8        3       3       1       4       2      12       7       2       6       9       5       6       1       0       1       2      14      19       1       0      25       2
  9        0       1       0       1       3      14       6       1      17       4       9       1       2       0       1       1       4       7       2       0       2       0
  10       4       4       1       0      12       3       2       1       2       4      18       7       3       0       7       1       4       3       4       0       4      12
  11       1      10       5       1       9       8       0      11       2       3       2       5       0       2       5       2       1       7       5       0       0       2
  12       1       2       5       4       8       4       4       1      16       2       9       1       0       0       0       7       4       0       6       0       0       4
  13       0       1       0       0       0       1       3       0       1       0       3       0       1       0       0       0       0       1      20       0       5       0
  14       0       9       0       1       2       0       1       1       1       3       1       4       1       5       0       0       1      11       2       0       6       7
  15       1       2       0       1       8       6       2       1       0       1       4       1       2       0       1       0       0       1       6       0       0       2
  16       0       2       0       0       2       2       0       0       1       0       0       1       1       2       1       0       0       0       1       0       1       2
  17       0       1       1       0       0       0       1       0       0       3       1       0       1       0       0       0       0       2       1       0       4       0
    
     4542.P1 4545.P1 4546.P1 4558.P1 4571.P1
  0       78      57      44      44      10
  1       41      17      38      28      11
  2       11       1       8      11      30
  3        2       6       3       3       2
  4       13      14      64      22       4
  5       12       3       4       3      11
  6        0       0       0       0       0
  7       23       4       4       7       8
  8        5       8       1       3       9
  9       37       5       2       5       2
  10       5       6      12      19       1
  11       1       1       1       0       0
  12       1       1       2       1       0
  13       3       5       1       6      15
  14       2       6       3       2       4
  15       2       0       1       2       1
  16       3       1       0       0       4
  17       1       0       0       1       0
cat("\n\nHow many cells per patient ...?")


How many cells per patient ...?
sort(table(scRNAseqData@meta.data$Patient))

4440 4472 4478 4477 4500 4458 4459 4502 4455 4496 4501 4489 4476 4448 4571 4495 4432 4520 4545 4513 4558 4535 4488 4480 4470 4486 4487 4546 4491 4530 4521 4447 4542 4450 4452 4453 4443 
  11   32   40   41   45   47   48   80   82   88   93  102  104  105  112  115  129  130  135  139  157  158  159  161  165  179  187  188  193  211  212  213  240  457  479  517  637 
cat("\n\nVisualizing these ratio's per study number and sample ...?")


Visualizing these ratio's per study number and sample ...?
UMAPPlot(scRNAseqData, label = TRUE, pt.size = 1.25, label.size = 4, group.by = "ident",
         repel = TRUE)
ggsave(paste0(PLOT_loc, "/", Today, ".UMAP.png"), plot = last_plot())
Saving 7.29 x 4.51 in image
ggsave(paste0(PLOT_loc, "/", Today, ".UMAP.ps"), plot = last_plot())
Saving 7.29 x 4.51 in image

barplot(prop.table(x = table(scRNAseqData@active.ident, scRNAseqData@meta.data$Patient)), 
        cex.axis = 1.0, cex.names = 0.5, las = 1,
        col = uithof_color, xlab = "study number", legend.text = FALSE, args.legend = list(x = "bottom"))
dev.copy(pdf, paste0(QC_loc, "/", Today, ".cell_ratios_per_sample.pdf"))
pdf 
  3 
dev.off()
quartz_off_screen 
                2 

barplot(prop.table(x = table(scRNAseqData@active.ident, scRNAseqData@meta.data$ID)), 
        cex.axis = 1.0, cex.names = 0.5, las = 2,
        col = uithof_color, xlab = "sample ID", legend.text = FALSE, args.legend = list(x = "bottom"))
dev.copy(pdf, paste0(QC_loc, "/", Today, ".cell_ratios_per_sample_per_plate.pdf"))
pdf 
  3 
dev.off()
quartz_off_screen 
                2 

4.2 Visualisations

Let’s project known cellular markers.


UMAPPlot(scRNAseqData, label = FALSE, pt.size = 1.25, label.size = 4, group.by = "ident",
         repel = TRUE)


# endothelial cells
FeaturePlot(scRNAseqData, features = c("CD34"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("EDN1"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("EDNRA", "EDNRB"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("CDH5", "PECAM1"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("ACKR1"), cols =  c("#ECECEC", "#DB003F"))


# SMC
FeaturePlot(scRNAseqData, features = c("MYH11"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("LGALS3", "ACTA2"), cols =  c("#ECECEC", "#DB003F"))


# macrophages
FeaturePlot(scRNAseqData, features = c("CD14", "CD68"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("CD36"), cols =  c("#ECECEC", "#DB003F"))


# t-cells
FeaturePlot(scRNAseqData, features = c("CD3E"), cols =  c("#ECECEC", "#DB003F"))

FeaturePlot(scRNAseqData, features = c("CD4"), cols =  c("#ECECEC", "#DB003F"))

# FeaturePlot(scRNAseqData, features = c("CD8"), cols =  c("#ECECEC", "#DB003F"))

# b-cells
FeaturePlot(scRNAseqData, features = c("CD79A"), cols =  c("#ECECEC", "#DB003F"))


# mast cells
FeaturePlot(scRNAseqData, features = c("KIT"), cols =  c("#ECECEC", "#DB003F"))


# NK cells
FeaturePlot(scRNAseqData, features = c("NCAM1"), cols =  c("#ECECEC", "#DB003F"))

4.3 Targets of interest

We check whether the targets genes, PCSK9, COL4A1, COL4A2, COL3A, COL2A, LDLR, CD36, were sequenced using our method (STARseq).

Several genes are not present or have different names, these are listed here, and were manually removed from/changed in the list.

  • COL3A, not found
  • COL2A, not found

4.3.1 Expression in cell communities

target_genes_rm <- c("COL3A", "COL2A")

temp = target_genes[!target_genes %in% target_genes_rm]

target_genes_qc <- c(temp)

# VlnPlot(scRNAseqData, features = "LINC01600")

# Make directory for plots
ifelse(!dir.exists(file.path(PLOT_loc, "/VlnPlots")), 
       dir.create(file.path(PLOT_loc, "/VlnPlots")), 
       FALSE)
[1] FALSE
VLN_loc = paste0(PLOT_loc,"/VlnPlots")

# Make directory for plots
ifelse(!dir.exists(file.path(PLOT_loc, "/DotPlots")), 
       dir.create(file.path(PLOT_loc, "/DotPlots")), 
       FALSE)
[1] FALSE
DOT_loc = paste0(PLOT_loc,"/DotPlots")

# Make directory for plots
ifelse(!dir.exists(file.path(PLOT_loc, "/FeaturePlots")), 
       dir.create(file.path(PLOT_loc, "/FeaturePlots")), 
       FALSE)
[1] FALSE
FEAT_loc = paste0(PLOT_loc,"/FeaturePlots")


for (GENE in target_genes_qc){
  print(paste0("Projecting the expression of ", GENE, "."))

  vp1 <-  VlnPlot(scRNAseqData, features = GENE) + 
    xlab("cell communities") + 
    ylab(bquote("normalized expression")) +
    theme(axis.title.x = element_text(color = "#000000", size = 14, face = "bold"), 
            axis.title.y = element_text(color = "#000000", size = 14, face = "bold"), 
            legend.position = "none")
    ggsave(paste0(VLN_loc, "/", Today, ".VlnPlot.",GENE,".png"), plot = last_plot())
    ggsave(paste0(VLN_loc, "/", Today, ".VlnPlot.",GENE,".ps"), plot = last_plot())
  
  print(vp1)
  
}
[1] "Projecting the expression of PCSK9."
Saving 7 x 7 in image
Saving 7 x 7 in image
[1] "Projecting the expression of COL4A1."
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
[1] "Projecting the expression of COL4A2."
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
[1] "Projecting the expression of LDLR."
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
[1] "Projecting the expression of CD36."
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image

library(RColorBrewer)

p1 <- DotPlot(scRNAseqData, features = target_genes_qc,
        cols = "RdBu")

p1 + theme(axis.text.x = element_text(angle = 45, hjust=1, size = 5))

ggsave(paste0(DOT_loc, "/", Today, ".DotPlot.Targets.png"), plot = last_plot())
Saving 7.29 x 4.51 in image
ggsave(paste0(DOT_loc, "/", Today, ".DotPlot.Targets.ps"), plot = last_plot())
Saving 7.29 x 4.51 in image

rm(p1)

FeaturePlot(scRNAseqData, features = c(target_genes_qc),
            cols =  c("#ECECEC", "#DB003F", "#9A3480","#1290D9"),
            combine = TRUE)

ggsave(paste0(FEAT_loc, "/", Today, ".FeaturePlot.Targets.png"), plot = last_plot())
Saving 7.29 x 4.51 in image
ggsave(paste0(FEAT_loc, "/", Today, ".FeaturePlot.Targets.ps"), plot = last_plot())
Saving 7.29 x 4.51 in image

for (GENE in target_genes_qc){
  print(paste0("Projecting the expression of ", GENE, "."))

  fp1 <-  FeaturePlot(scRNAseqData, features = GENE, cols =  c("#ECECEC", "#DB003F", "#9A3480","#1290D9"),
            combine = TRUE) + 
    xlab("cell communities") + 
    ylab(bquote("normalized expression")) +
    theme(axis.title.x = element_text(color = "#000000", size = 14, face = "bold"), 
            axis.title.y = element_text(color = "#000000", size = 14, face = "bold"), 
            legend.position = "right")
    ggsave(paste0(FEAT_loc, "/", Today, ".FeaturePlot.",GENE,".png"), plot = last_plot())
    ggsave(paste0(FEAT_loc, "/", Today, ".FeaturePlot.",GENE,".ps"), plot = last_plot())
  
  print(fp1)
  
}
[1] "Projecting the expression of PCSK9."
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
[1] "Projecting the expression of COL4A1."
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
[1] "Projecting the expression of COL4A2."
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
[1] "Projecting the expression of LDLR."
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image
[1] "Projecting the expression of CD36."
Saving 7.29 x 4.51 in image
Saving 7.29 x 4.51 in image

4.3.2 Differential expression between cell communities

Here we project genes to only the broad cell communities:

  • macrophages
  • endothelial cells
  • smooth muscle cells
  • T-cells
  • B-cells
  • Mast cells
  • NK-cells
  • Mixed cells

4.3.2.1 Macrophages

Comparison between the macrophages cell communities (CD14/CD68+), and all other communities.


MAC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("CD14+CD68+ M I", 
                                      "CD14+CD68+ M II", 
                                      "CD14+CD68+ M III"), 
                          ident.2 = c(#"CD14+CD68+ M I", 
                                      #"CD14+CD68+ M II", 
                                      #"CD14+CD68+ M III",
                                      "CD3+CD8+ T I",
                                      "CD3+CD8A+ T II", 
                                      "CD3+CD8A+ T III", 
                                      "CD3+CD4+ T I", 
                                      "CD3+CD4+ T II", 
                                      "CD3 Tregs", 
                                      "CD34+ EC I", 
                                      "CD34+ EC II",
                                      "Mixed I", 
                                      "Mixed II", 
                                      "ACTA2+ SMC", 
                                      "NCAM1+ NK", 
                                      "KIT+ MC",
                                      "CD79A+ B I", 
                                      "CD79A+ B II"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 00s      
  |++                                                | 2 % ~47s          
  |++                                                | 3 % ~42s          
  |+++                                               | 4 % ~39s          
  |+++                                               | 5 % ~38s          
  |++++                                              | 6 % ~38s          
  |++++                                              | 7 % ~36s          
  |+++++                                             | 8 % ~35s          
  |+++++                                             | 9 % ~35s          
  |++++++                                            | 10% ~34s          
  |++++++                                            | 11% ~33s          
  |+++++++                                           | 12% ~34s          
  |+++++++                                           | 13% ~33s          
  |++++++++                                          | 14% ~33s          
  |++++++++                                          | 15% ~32s          
  |+++++++++                                         | 16% ~32s          
  |+++++++++                                         | 17% ~31s          
  |++++++++++                                        | 18% ~31s          
  |++++++++++                                        | 19% ~30s          
  |+++++++++++                                       | 20% ~30s          
  |+++++++++++                                       | 21% ~31s          
  |++++++++++++                                      | 22% ~30s          
  |++++++++++++                                      | 23% ~30s          
  |+++++++++++++                                     | 24% ~29s          
  |+++++++++++++                                     | 26% ~29s          
  |++++++++++++++                                    | 27% ~28s          
  |++++++++++++++                                    | 28% ~28s          
  |+++++++++++++++                                   | 29% ~27s          
  |+++++++++++++++                                   | 30% ~27s          
  |++++++++++++++++                                  | 31% ~26s          
  |++++++++++++++++                                  | 32% ~26s          
  |+++++++++++++++++                                 | 33% ~25s          
  |+++++++++++++++++                                 | 34% ~25s          
  |++++++++++++++++++                                | 35% ~25s          
  |++++++++++++++++++                                | 36% ~24s          
  |+++++++++++++++++++                               | 37% ~24s          
  |+++++++++++++++++++                               | 38% ~23s          
  |++++++++++++++++++++                              | 39% ~23s          
  |++++++++++++++++++++                              | 40% ~23s          
  |+++++++++++++++++++++                             | 41% ~23s          
  |+++++++++++++++++++++                             | 42% ~22s          
  |++++++++++++++++++++++                            | 43% ~22s          
  |++++++++++++++++++++++                            | 44% ~21s          
  |+++++++++++++++++++++++                           | 45% ~21s          
  |+++++++++++++++++++++++                           | 46% ~21s          
  |++++++++++++++++++++++++                          | 47% ~20s          
  |++++++++++++++++++++++++                          | 48% ~20s          
  |+++++++++++++++++++++++++                         | 49% ~19s          
  |+++++++++++++++++++++++++                         | 50% ~19s          
  |++++++++++++++++++++++++++                        | 51% ~19s          
  |+++++++++++++++++++++++++++                       | 52% ~18s          
  |+++++++++++++++++++++++++++                       | 53% ~18s          
  |++++++++++++++++++++++++++++                      | 54% ~20s          
  |++++++++++++++++++++++++++++                      | 55% ~20s          
  |+++++++++++++++++++++++++++++                     | 56% ~19s          
  |+++++++++++++++++++++++++++++                     | 57% ~19s          
  |++++++++++++++++++++++++++++++                    | 58% ~18s          
  |++++++++++++++++++++++++++++++                    | 59% ~18s          
  |+++++++++++++++++++++++++++++++                   | 60% ~17s          
  |+++++++++++++++++++++++++++++++                   | 61% ~17s          
  |++++++++++++++++++++++++++++++++                  | 62% ~16s          
  |++++++++++++++++++++++++++++++++                  | 63% ~16s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~15s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~15s          
  |++++++++++++++++++++++++++++++++++                | 66% ~14s          
  |++++++++++++++++++++++++++++++++++                | 67% ~14s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~13s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~13s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~13s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~12s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~12s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~11s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~11s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~10s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~10s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~10s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~09s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=41s  
DT::datatable(MAC.markers)

MAC_Volcano_TargetsA = EnhancedVolcano(MAC.markers,
    lab = rownames(MAC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "Macrophage markers\n(Macrophage communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/N_GENES, # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels=c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
Warning: One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...
# MAC_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.MAC.DEG.Targets.pdf"), 
       plot = MAC_Volcano_TargetsA)
Saving 7 x 7 in image

The target results are given below and written to a file.

library(tibble)
MAC.markers <- add_column(MAC.markers, Gene = row.names(MAC.markers), .before = 1)

temp <- MAC.markers[MAC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".MAC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

4.3.2.2 Smooth muscle cells

Comparison between the smooth muscle cell communities (ACTA2+), and all other communities.


SMC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("ACTA2+ SMC"), 
                          ident.2 = c("CD14+CD68+ M I", 
                                      "CD14+CD68+ M II", 
                                      "CD14+CD68+ M III",
                                      "CD3+CD8+ T I",
                                      "CD3+CD8A+ T II", 
                                      "CD3+CD8A+ T III", 
                                      "CD3+CD4+ T I", 
                                      "CD3+CD4+ T II", 
                                      "CD3 Tregs", 
                                      "CD34+ EC I", 
                                      "CD34+ EC II",
                                      "Mixed I", 
                                      "Mixed II", 
                                      # "ACTA2+ SMC", 
                                      "NCAM1+ NK", 
                                      "KIT+ MC",
                                      "CD79A+ B I", 
                                      "CD79A+ B II"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 02s      
  |++                                                | 2 % ~59s          
  |++                                                | 3 % ~58s          
  |+++                                               | 4 % ~55s          
  |+++                                               | 5 % ~59s          
  |++++                                              | 6 % ~56s          
  |++++                                              | 7 % ~54s          
  |+++++                                             | 9 % ~53s          
  |+++++                                             | 10% ~51s          
  |++++++                                            | 11% ~53s          
  |++++++                                            | 12% ~55s          
  |+++++++                                           | 13% ~55s          
  |+++++++                                           | 14% ~53s          
  |++++++++                                          | 15% ~52s          
  |++++++++                                          | 16% ~51s          
  |+++++++++                                         | 17% ~50s          
  |++++++++++                                        | 18% ~49s          
  |++++++++++                                        | 19% ~48s          
  |+++++++++++                                       | 20% ~48s          
  |+++++++++++                                       | 21% ~47s          
  |++++++++++++                                      | 22% ~46s          
  |++++++++++++                                      | 23% ~45s          
  |+++++++++++++                                     | 24% ~44s          
  |+++++++++++++                                     | 26% ~44s          
  |++++++++++++++                                    | 27% ~43s          
  |++++++++++++++                                    | 28% ~43s          
  |+++++++++++++++                                   | 29% ~42s          
  |+++++++++++++++                                   | 30% ~42s          
  |++++++++++++++++                                  | 31% ~41s          
  |++++++++++++++++                                  | 32% ~40s          
  |+++++++++++++++++                                 | 33% ~39s          
  |++++++++++++++++++                                | 34% ~39s          
  |++++++++++++++++++                                | 35% ~42s          
  |+++++++++++++++++++                               | 36% ~41s          
  |+++++++++++++++++++                               | 37% ~40s          
  |++++++++++++++++++++                              | 38% ~39s          
  |++++++++++++++++++++                              | 39% ~38s          
  |+++++++++++++++++++++                             | 40% ~37s          
  |+++++++++++++++++++++                             | 41% ~37s          
  |++++++++++++++++++++++                            | 43% ~36s          
  |++++++++++++++++++++++                            | 44% ~35s          
  |+++++++++++++++++++++++                           | 45% ~34s          
  |+++++++++++++++++++++++                           | 46% ~33s          
  |++++++++++++++++++++++++                          | 47% ~32s          
  |++++++++++++++++++++++++                          | 48% ~32s          
  |+++++++++++++++++++++++++                         | 49% ~31s          
  |+++++++++++++++++++++++++                         | 50% ~30s          
  |++++++++++++++++++++++++++                        | 51% ~30s          
  |+++++++++++++++++++++++++++                       | 52% ~29s          
  |+++++++++++++++++++++++++++                       | 53% ~28s          
  |++++++++++++++++++++++++++++                      | 54% ~27s          
  |++++++++++++++++++++++++++++                      | 55% ~27s          
  |+++++++++++++++++++++++++++++                     | 56% ~26s          
  |+++++++++++++++++++++++++++++                     | 57% ~25s          
  |++++++++++++++++++++++++++++++                    | 59% ~24s          
  |++++++++++++++++++++++++++++++                    | 60% ~24s          
  |+++++++++++++++++++++++++++++++                   | 61% ~23s          
  |+++++++++++++++++++++++++++++++                   | 62% ~22s          
  |++++++++++++++++++++++++++++++++                  | 63% ~22s          
  |++++++++++++++++++++++++++++++++                  | 64% ~21s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~21s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~20s          
  |++++++++++++++++++++++++++++++++++                | 67% ~19s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~19s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~18s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~18s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~17s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~16s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~16s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~15s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~14s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~14s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~13s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~12s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~12s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~11s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=56s  
DT::datatable(SMC.markers)

SMC_Volcano_TargetsA = EnhancedVolcano(SMC.markers,
    lab = rownames(SMC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "SMC markers\n(SMC communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/N_GENES, # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels=c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
Warning: One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...
# SMC_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.SMC.DEG.Targets.pdf"), 
       plot = SMC_Volcano_TargetsA)
Saving 7 x 7 in image

The target results are given below and written to a file.

library(tibble)
SMC.markers <- add_column(SMC.markers, Gene = row.names(SMC.markers), .before = 1)

temp <- SMC.markers[SMC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".SMC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

4.3.2.3 Endothelial cells

Comparison between the endothelial cell communities (CD34+), and all other communities.


EC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("CD34+ EC I", "CD34+ EC II"), 
                          ident.2 = c("CD14+CD68+ M I", 
                                      "CD14+CD68+ M II", 
                                      "CD14+CD68+ M III",
                                      "CD3+CD8+ T I",
                                      "CD3+CD8A+ T II", 
                                      "CD3+CD8A+ T III", 
                                      "CD3+CD4+ T I", 
                                      "CD3+CD4+ T II", 
                                      "CD3 Tregs",
                                      # "CD34+ EC I", 
                                      # "CD34+ EC II",
                                      "Mixed I", 
                                      "Mixed II", 
                                      "ACTA2+ SMC",
                                      "NCAM1+ NK", 
                                      "KIT+ MC",
                                      "CD79A+ B I", 
                                      "CD79A+ B II"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 11s      
  |++                                                | 2 % ~58s          
  |++                                                | 3 % ~53s          
  |+++                                               | 4 % ~50s          
  |+++                                               | 5 % ~48s          
  |++++                                              | 6 % ~48s          
  |++++                                              | 8 % ~46s          
  |+++++                                             | 9 % ~45s          
  |+++++                                             | 10% ~44s          
  |++++++                                            | 11% ~44s          
  |++++++                                            | 12% ~43s          
  |+++++++                                           | 13% ~44s          
  |+++++++                                           | 14% ~43s          
  |++++++++                                          | 15% ~42s          
  |+++++++++                                         | 16% ~41s          
  |+++++++++                                         | 17% ~40s          
  |++++++++++                                        | 18% ~39s          
  |++++++++++                                        | 19% ~39s          
  |+++++++++++                                       | 20% ~38s          
  |+++++++++++                                       | 22% ~37s          
  |++++++++++++                                      | 23% ~37s          
  |++++++++++++                                      | 24% ~36s          
  |+++++++++++++                                     | 25% ~36s          
  |+++++++++++++                                     | 26% ~35s          
  |++++++++++++++                                    | 27% ~35s          
  |++++++++++++++                                    | 28% ~34s          
  |+++++++++++++++                                   | 29% ~34s          
  |++++++++++++++++                                  | 30% ~33s          
  |++++++++++++++++                                  | 31% ~33s          
  |+++++++++++++++++                                 | 32% ~32s          
  |+++++++++++++++++                                 | 33% ~32s          
  |++++++++++++++++++                                | 34% ~31s          
  |++++++++++++++++++                                | 35% ~31s          
  |+++++++++++++++++++                               | 37% ~30s          
  |+++++++++++++++++++                               | 38% ~30s          
  |++++++++++++++++++++                              | 39% ~29s          
  |++++++++++++++++++++                              | 40% ~29s          
  |+++++++++++++++++++++                             | 41% ~28s          
  |+++++++++++++++++++++                             | 42% ~28s          
  |++++++++++++++++++++++                            | 43% ~27s          
  |+++++++++++++++++++++++                           | 44% ~27s          
  |+++++++++++++++++++++++                           | 45% ~26s          
  |++++++++++++++++++++++++                          | 46% ~26s          
  |++++++++++++++++++++++++                          | 47% ~25s          
  |+++++++++++++++++++++++++                         | 48% ~25s          
  |+++++++++++++++++++++++++                         | 49% ~24s          
  |++++++++++++++++++++++++++                        | 51% ~24s          
  |++++++++++++++++++++++++++                        | 52% ~23s          
  |+++++++++++++++++++++++++++                       | 53% ~23s          
  |+++++++++++++++++++++++++++                       | 54% ~22s          
  |++++++++++++++++++++++++++++                      | 55% ~22s          
  |++++++++++++++++++++++++++++                      | 56% ~21s          
  |+++++++++++++++++++++++++++++                     | 57% ~20s          
  |++++++++++++++++++++++++++++++                    | 58% ~20s          
  |++++++++++++++++++++++++++++++                    | 59% ~19s          
  |+++++++++++++++++++++++++++++++                   | 60% ~19s          
  |+++++++++++++++++++++++++++++++                   | 61% ~19s          
  |++++++++++++++++++++++++++++++++                  | 62% ~18s          
  |++++++++++++++++++++++++++++++++                  | 63% ~18s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~17s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~17s          
  |++++++++++++++++++++++++++++++++++                | 67% ~16s          
  |++++++++++++++++++++++++++++++++++                | 68% ~16s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~15s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~15s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~14s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~14s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~13s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~13s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~12s          
  |+++++++++++++++++++++++++++++++++++++++           | 76% ~12s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~11s          
  |++++++++++++++++++++++++++++++++++++++++          | 78% ~11s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 90% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=51s  
DT::datatable(EC.markers)

EC_Volcano_TargetsA = EnhancedVolcano(EC.markers,
    lab = rownames(EC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "Endothelial cell markers\n(EC communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/N_GENES, # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels=c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
Warning: One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...
# EC_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.EC.DEG.Targets.pdf"), 
       plot = EC_Volcano_TargetsA)
Saving 7 x 7 in image

The target results are given below and written to a file.

library(tibble)
EC.markers <- add_column(EC.markers, Gene = row.names(EC.markers), .before = 1)

temp <- EC.markers[EC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".EC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

4.3.2.4 T-cells

Comparison between the T-cell communities (CD3/CD4/CD8+), and all other communities.


TC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("CD3+CD8+ T I",
                                      "CD3+CD8A+ T II", 
                                      "CD3+CD8A+ T III", 
                                      "CD3+CD4+ T I", 
                                      "CD3+CD4+ T II", 
                                      "CD3 Tregs"), 
                          ident.2 = c("CD14+CD68+ M I", 
                                      "CD14+CD68+ M II", 
                                      "CD14+CD68+ M III",
                                      # "CD3+CD8+ T I",
                                      # "CD3+CD8A+ T II ", 
                                      # "CD3+CD8A+ T III", 
                                      # "CD3+CD4+ T I", 
                                      # "CD3+CD4+ T II", 
                                      # "CD3 Tregs", 
                                      "CD34+ EC I", 
                                      "CD34+ EC II",
                                      "Mixed I", 
                                      "Mixed II", 
                                      "ACTA2+ SMC",
                                      "NCAM1+ NK", 
                                      "KIT+ MC",
                                      "CD79A+ B I", 
                                      "CD79A+ B II"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~43s          
  |++                                                | 2 % ~44s          
  |++                                                | 3 % ~46s          
  |+++                                               | 4 % ~44s          
  |+++                                               | 5 % ~42s          
  |++++                                              | 6 % ~41s          
  |++++                                              | 7 % ~39s          
  |+++++                                             | 8 % ~38s          
  |+++++                                             | 9 % ~36s          
  |++++++                                            | 11% ~35s          
  |++++++                                            | 12% ~35s          
  |+++++++                                           | 13% ~34s          
  |+++++++                                           | 14% ~33s          
  |++++++++                                          | 15% ~33s          
  |++++++++                                          | 16% ~32s          
  |+++++++++                                         | 17% ~31s          
  |+++++++++                                         | 18% ~31s          
  |++++++++++                                        | 19% ~30s          
  |++++++++++                                        | 20% ~31s          
  |+++++++++++                                       | 21% ~30s          
  |++++++++++++                                      | 22% ~30s          
  |++++++++++++                                      | 23% ~29s          
  |+++++++++++++                                     | 24% ~29s          
  |+++++++++++++                                     | 25% ~28s          
  |++++++++++++++                                    | 26% ~28s          
  |++++++++++++++                                    | 27% ~27s          
  |+++++++++++++++                                   | 28% ~27s          
  |+++++++++++++++                                   | 29% ~26s          
  |++++++++++++++++                                  | 31% ~26s          
  |++++++++++++++++                                  | 32% ~25s          
  |+++++++++++++++++                                 | 33% ~25s          
  |+++++++++++++++++                                 | 34% ~24s          
  |++++++++++++++++++                                | 35% ~25s          
  |++++++++++++++++++                                | 36% ~24s          
  |+++++++++++++++++++                               | 37% ~24s          
  |+++++++++++++++++++                               | 38% ~23s          
  |++++++++++++++++++++                              | 39% ~23s          
  |++++++++++++++++++++                              | 40% ~23s          
  |+++++++++++++++++++++                             | 41% ~22s          
  |++++++++++++++++++++++                            | 42% ~22s          
  |++++++++++++++++++++++                            | 43% ~21s          
  |+++++++++++++++++++++++                           | 44% ~21s          
  |+++++++++++++++++++++++                           | 45% ~20s          
  |++++++++++++++++++++++++                          | 46% ~23s          
  |++++++++++++++++++++++++                          | 47% ~23s          
  |+++++++++++++++++++++++++                         | 48% ~22s          
  |+++++++++++++++++++++++++                         | 49% ~22s          
  |++++++++++++++++++++++++++                        | 51% ~21s          
  |++++++++++++++++++++++++++                        | 52% ~21s          
  |+++++++++++++++++++++++++++                       | 53% ~20s          
  |+++++++++++++++++++++++++++                       | 54% ~19s          
  |++++++++++++++++++++++++++++                      | 55% ~19s          
  |++++++++++++++++++++++++++++                      | 56% ~18s          
  |+++++++++++++++++++++++++++++                     | 57% ~18s          
  |+++++++++++++++++++++++++++++                     | 58% ~17s          
  |++++++++++++++++++++++++++++++                    | 59% ~17s          
  |++++++++++++++++++++++++++++++                    | 60% ~16s          
  |+++++++++++++++++++++++++++++++                   | 61% ~16s          
  |++++++++++++++++++++++++++++++++                  | 62% ~16s          
  |++++++++++++++++++++++++++++++++                  | 63% ~15s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~15s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~14s          
  |++++++++++++++++++++++++++++++++++                | 66% ~14s          
  |++++++++++++++++++++++++++++++++++                | 67% ~13s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~13s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~12s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~12s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~12s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~11s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~11s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~10s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~10s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~10s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~09s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~09s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 86% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 88% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=39s  
DT::datatable(TC.markers)

TC_Volcano_TargetsA = EnhancedVolcano(TC.markers,
    lab = rownames(TC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "T-cell markers\n(T-cell communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/N_GENES, # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels=c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
Warning: One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...
# TC_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.TC.DEG.Targets.pdf"), 
       plot = TC_Volcano_TargetsA)
Saving 7 x 7 in image

The target results are given below and written to a file.

library(tibble)
TC.markers <- add_column(TC.markers, Gene = row.names(TC.markers), .before = 1)

temp <- TC.markers[TC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".TC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

4.3.2.5 B-cells

Comparison between the B-cell communities (CD79A+), and all other communities.


BC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("CD79A+ B I", 
                                      "CD79A+ B II"), 
                          ident.2 = c("CD14+CD68+ M I", 
                                      "CD14+CD68+ M II", 
                                      "CD14+CD68+ M III",
                                      "CD3+CD8+ T I",
                                      "CD3+CD8A+ T II", 
                                      "CD3+CD8A+ T III", 
                                      "CD3+CD4+ T I", 
                                      "CD3+CD4+ T II", 
                                      "CD3 Tregs",
                                      "CD34+ EC I", 
                                      "CD34+ EC II",
                                      "Mixed I", 
                                      "Mixed II", 
                                      "ACTA2+ SMC",
                                      "NCAM1+ NK", 
                                      "KIT+ MC"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~33s          
  |++                                                | 2 % ~48s          
  |++                                                | 3 % ~42s          
  |+++                                               | 4 % ~37s          
  |+++                                               | 5 % ~34s          
  |++++                                              | 6 % ~32s          
  |++++                                              | 7 % ~30s          
  |+++++                                             | 8 % ~29s          
  |+++++                                             | 9 % ~28s          
  |++++++                                            | 10% ~27s          
  |++++++                                            | 11% ~26s          
  |+++++++                                           | 12% ~25s          
  |+++++++                                           | 13% ~24s          
  |++++++++                                          | 14% ~24s          
  |++++++++                                          | 15% ~23s          
  |+++++++++                                         | 16% ~23s          
  |+++++++++                                         | 17% ~22s          
  |++++++++++                                        | 18% ~22s          
  |++++++++++                                        | 19% ~21s          
  |+++++++++++                                       | 20% ~21s          
  |+++++++++++                                       | 21% ~21s          
  |++++++++++++                                      | 22% ~20s          
  |++++++++++++                                      | 23% ~20s          
  |+++++++++++++                                     | 24% ~21s          
  |+++++++++++++                                     | 26% ~20s          
  |++++++++++++++                                    | 27% ~20s          
  |++++++++++++++                                    | 28% ~20s          
  |+++++++++++++++                                   | 29% ~19s          
  |+++++++++++++++                                   | 30% ~19s          
  |++++++++++++++++                                  | 31% ~18s          
  |++++++++++++++++                                  | 32% ~18s          
  |+++++++++++++++++                                 | 33% ~18s          
  |+++++++++++++++++                                 | 34% ~17s          
  |++++++++++++++++++                                | 35% ~17s          
  |++++++++++++++++++                                | 36% ~17s          
  |+++++++++++++++++++                               | 37% ~16s          
  |+++++++++++++++++++                               | 38% ~16s          
  |++++++++++++++++++++                              | 39% ~16s          
  |++++++++++++++++++++                              | 40% ~16s          
  |+++++++++++++++++++++                             | 41% ~15s          
  |+++++++++++++++++++++                             | 42% ~15s          
  |++++++++++++++++++++++                            | 43% ~15s          
  |++++++++++++++++++++++                            | 44% ~15s          
  |+++++++++++++++++++++++                           | 45% ~14s          
  |+++++++++++++++++++++++                           | 46% ~14s          
  |++++++++++++++++++++++++                          | 47% ~14s          
  |++++++++++++++++++++++++                          | 48% ~14s          
  |+++++++++++++++++++++++++                         | 49% ~13s          
  |+++++++++++++++++++++++++                         | 50% ~13s          
  |++++++++++++++++++++++++++                        | 51% ~13s          
  |+++++++++++++++++++++++++++                       | 52% ~12s          
  |+++++++++++++++++++++++++++                       | 53% ~12s          
  |++++++++++++++++++++++++++++                      | 54% ~12s          
  |++++++++++++++++++++++++++++                      | 55% ~12s          
  |+++++++++++++++++++++++++++++                     | 56% ~11s          
  |+++++++++++++++++++++++++++++                     | 57% ~11s          
  |++++++++++++++++++++++++++++++                    | 58% ~11s          
  |++++++++++++++++++++++++++++++                    | 59% ~11s          
  |+++++++++++++++++++++++++++++++                   | 60% ~10s          
  |+++++++++++++++++++++++++++++++                   | 61% ~10s          
  |++++++++++++++++++++++++++++++++                  | 62% ~10s          
  |++++++++++++++++++++++++++++++++                  | 63% ~10s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~09s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~09s          
  |++++++++++++++++++++++++++++++++++                | 66% ~09s          
  |++++++++++++++++++++++++++++++++++                | 67% ~08s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~08s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~08s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~08s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~07s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~07s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~08s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~08s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~07s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~07s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~07s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~06s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=28s  
DT::datatable(BC.markers)

BC_Volcano_TargetsA = EnhancedVolcano(BC.markers,
    lab = rownames(BC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "B-cell markers\n(B-cell communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/N_GENES, # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels=c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
Warning: One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...
# BC_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.BC.DEG.Targets.pdf"), 
       plot = BC_Volcano_TargetsA)
Saving 7 x 7 in image

The target results are given below and written to a file.

library(tibble)
BC.markers <- add_column(BC.markers, Gene = row.names(BC.markers), .before = 1)

temp <- BC.markers[BC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".BC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

4.3.2.6 Mast cells

Comparison between the mast cell communities (KIT+), and all other communities.


MC.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("KIT+ MC"), 
                          ident.2 = c("CD14+CD68+ M I", 
                                      "CD14+CD68+ M II", 
                                      "CD14+CD68+ M III",
                                      "CD3+CD8+ T I",
                                      "CD3+CD8A+ T II", 
                                      "CD3+CD8A+ T III", 
                                      "CD3+CD4+ T I", 
                                      "CD3+CD4+ T II", 
                                      "CD3 Tregs",
                                      "CD34+ EC I", 
                                      "CD34+ EC II",
                                      "Mixed I", 
                                      "Mixed II", 
                                      "ACTA2+ SMC",
                                      "NCAM1+ NK", 
                                      # "KIT+ MC",
                                      "CD79A+ B I", 
                                      "CD79A+ B II"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~41s          
  |++                                                | 2 % ~42s          
  |++                                                | 3 % ~42s          
  |+++                                               | 4 % ~46s          
  |+++                                               | 5 % ~44s          
  |++++                                              | 6 % ~42s          
  |++++                                              | 7 % ~41s          
  |+++++                                             | 8 % ~40s          
  |+++++                                             | 9 % ~39s          
  |++++++                                            | 10% ~38s          
  |++++++                                            | 11% ~38s          
  |+++++++                                           | 12% ~37s          
  |+++++++                                           | 13% ~36s          
  |++++++++                                          | 14% ~35s          
  |++++++++                                          | 15% ~35s          
  |+++++++++                                         | 16% ~35s          
  |+++++++++                                         | 17% ~34s          
  |++++++++++                                        | 18% ~35s          
  |++++++++++                                        | 19% ~38s          
  |+++++++++++                                       | 20% ~37s          
  |+++++++++++                                       | 21% ~36s          
  |++++++++++++                                      | 22% ~36s          
  |++++++++++++                                      | 23% ~36s          
  |+++++++++++++                                     | 24% ~35s          
  |+++++++++++++                                     | 25% ~35s          
  |++++++++++++++                                    | 26% ~34s          
  |++++++++++++++                                    | 27% ~33s          
  |+++++++++++++++                                   | 28% ~32s          
  |+++++++++++++++                                   | 29% ~32s          
  |++++++++++++++++                                  | 30% ~32s          
  |++++++++++++++++                                  | 31% ~32s          
  |+++++++++++++++++                                 | 32% ~31s          
  |+++++++++++++++++                                 | 33% ~31s          
  |++++++++++++++++++                                | 34% ~30s          
  |++++++++++++++++++                                | 35% ~30s          
  |+++++++++++++++++++                               | 36% ~29s          
  |+++++++++++++++++++                               | 37% ~28s          
  |++++++++++++++++++++                              | 38% ~28s          
  |++++++++++++++++++++                              | 39% ~27s          
  |+++++++++++++++++++++                             | 40% ~27s          
  |+++++++++++++++++++++                             | 41% ~27s          
  |++++++++++++++++++++++                            | 42% ~26s          
  |++++++++++++++++++++++                            | 43% ~26s          
  |+++++++++++++++++++++++                           | 44% ~25s          
  |+++++++++++++++++++++++                           | 45% ~24s          
  |++++++++++++++++++++++++                          | 46% ~24s          
  |++++++++++++++++++++++++                          | 47% ~23s          
  |+++++++++++++++++++++++++                         | 48% ~23s          
  |+++++++++++++++++++++++++                         | 49% ~22s          
  |++++++++++++++++++++++++++                        | 51% ~22s          
  |++++++++++++++++++++++++++                        | 52% ~23s          
  |+++++++++++++++++++++++++++                       | 53% ~22s          
  |+++++++++++++++++++++++++++                       | 54% ~22s          
  |++++++++++++++++++++++++++++                      | 55% ~21s          
  |++++++++++++++++++++++++++++                      | 56% ~21s          
  |+++++++++++++++++++++++++++++                     | 57% ~20s          
  |+++++++++++++++++++++++++++++                     | 58% ~20s          
  |++++++++++++++++++++++++++++++                    | 59% ~19s          
  |++++++++++++++++++++++++++++++                    | 60% ~19s          
  |+++++++++++++++++++++++++++++++                   | 61% ~18s          
  |+++++++++++++++++++++++++++++++                   | 62% ~18s          
  |++++++++++++++++++++++++++++++++                  | 63% ~17s          
  |++++++++++++++++++++++++++++++++                  | 64% ~17s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~16s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~16s          
  |++++++++++++++++++++++++++++++++++                | 67% ~15s          
  |++++++++++++++++++++++++++++++++++                | 68% ~15s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~15s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~14s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~14s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~14s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~13s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~13s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~12s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~12s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~11s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~11s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~10s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~10s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~09s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~08s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~07s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~05s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=52s  
DT::datatable(MC.markers)

MC_Volcano_TargetsA = EnhancedVolcano(MC.markers,
    lab = rownames(MC.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "Mast cell markers\n(Mast cell communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/N_GENES, # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels=c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
Warning: One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...
# MC_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.MC.DEG.Targets.pdf"), 
       plot = MC_Volcano_TargetsA)
Saving 7 x 7 in image

The target results are given below and written to a file.

library(tibble)
MC.markers <- add_column(MC.markers, Gene = row.names(MC.markers), .before = 1)

temp <- MC.markers[MC.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".MC.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

4.3.2.7 NK-cells

Comparison between the natural killer cell communities (NCAM1+), and all other communities.


NK.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("NCAM1+ NK"), 
                          ident.2 = c("CD14+CD68+ M I", 
                                      "CD14+CD68+ M II", 
                                      "CD14+CD68+ M III",
                                      "CD3+CD8+ T I",
                                      "CD3+CD8A+ T II", 
                                      "CD3+CD8A+ T III", 
                                      "CD3+CD4+ T I", 
                                      "CD3+CD4+ T II", 
                                      "CD3 Tregs",
                                      "CD34+ EC I", 
                                      "CD34+ EC II",
                                      "Mixed I",
                                      "Mixed II",
                                      "ACTA2+ SMC", 
                                      # "NCAM1+ NK", 
                                      "KIT+ MC",
                                      "CD79A+ B I", 
                                      "CD79A+ B II"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~24s          
  |++                                                | 2 % ~27s          
  |++                                                | 3 % ~26s          
  |+++                                               | 4 % ~27s          
  |+++                                               | 5 % ~26s          
  |++++                                              | 6 % ~25s          
  |++++                                              | 7 % ~24s          
  |+++++                                             | 8 % ~24s          
  |+++++                                             | 9 % ~23s          
  |++++++                                            | 10% ~23s          
  |++++++                                            | 11% ~22s          
  |+++++++                                           | 12% ~22s          
  |+++++++                                           | 13% ~21s          
  |++++++++                                          | 14% ~21s          
  |++++++++                                          | 15% ~21s          
  |+++++++++                                         | 16% ~20s          
  |+++++++++                                         | 17% ~20s          
  |++++++++++                                        | 18% ~20s          
  |++++++++++                                        | 19% ~19s          
  |+++++++++++                                       | 20% ~19s          
  |+++++++++++                                       | 21% ~18s          
  |++++++++++++                                      | 22% ~18s          
  |++++++++++++                                      | 23% ~18s          
  |+++++++++++++                                     | 24% ~18s          
  |+++++++++++++                                     | 25% ~18s          
  |++++++++++++++                                    | 26% ~17s          
  |++++++++++++++                                    | 27% ~18s          
  |+++++++++++++++                                   | 28% ~18s          
  |+++++++++++++++                                   | 29% ~18s          
  |++++++++++++++++                                  | 30% ~17s          
  |++++++++++++++++                                  | 31% ~17s          
  |+++++++++++++++++                                 | 32% ~17s          
  |+++++++++++++++++                                 | 33% ~17s          
  |++++++++++++++++++                                | 34% ~16s          
  |++++++++++++++++++                                | 35% ~16s          
  |+++++++++++++++++++                               | 36% ~16s          
  |+++++++++++++++++++                               | 37% ~16s          
  |++++++++++++++++++++                              | 38% ~15s          
  |++++++++++++++++++++                              | 39% ~15s          
  |+++++++++++++++++++++                             | 40% ~15s          
  |+++++++++++++++++++++                             | 41% ~15s          
  |++++++++++++++++++++++                            | 42% ~14s          
  |++++++++++++++++++++++                            | 43% ~14s          
  |+++++++++++++++++++++++                           | 44% ~14s          
  |+++++++++++++++++++++++                           | 45% ~14s          
  |++++++++++++++++++++++++                          | 46% ~13s          
  |++++++++++++++++++++++++                          | 47% ~13s          
  |+++++++++++++++++++++++++                         | 48% ~13s          
  |+++++++++++++++++++++++++                         | 49% ~12s          
  |++++++++++++++++++++++++++                        | 51% ~12s          
  |++++++++++++++++++++++++++                        | 52% ~12s          
  |+++++++++++++++++++++++++++                       | 53% ~12s          
  |+++++++++++++++++++++++++++                       | 54% ~11s          
  |++++++++++++++++++++++++++++                      | 55% ~11s          
  |++++++++++++++++++++++++++++                      | 56% ~11s          
  |+++++++++++++++++++++++++++++                     | 57% ~11s          
  |+++++++++++++++++++++++++++++                     | 58% ~10s          
  |++++++++++++++++++++++++++++++                    | 59% ~10s          
  |++++++++++++++++++++++++++++++                    | 60% ~10s          
  |+++++++++++++++++++++++++++++++                   | 61% ~10s          
  |+++++++++++++++++++++++++++++++                   | 62% ~09s          
  |++++++++++++++++++++++++++++++++                  | 63% ~09s          
  |++++++++++++++++++++++++++++++++                  | 64% ~09s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~08s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~08s          
  |++++++++++++++++++++++++++++++++++                | 67% ~08s          
  |++++++++++++++++++++++++++++++++++                | 68% ~08s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~07s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~07s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~07s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~07s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~06s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~06s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~06s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~06s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=24s  
DT::datatable(NK.markers)

NK_Volcano_TargetsA = EnhancedVolcano(NK.markers,
    lab = rownames(NK.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "NK markers\n(NK-cell communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/N_GENES, # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels=c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
# NK_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.NK.DEG.Targets.pdf"), 
       plot = NK_Volcano_TargetsA)
Saving 7 x 7 in image

The target results are given below and written to a file.

library(tibble)
NK.markers <- add_column(NK.markers, Gene = row.names(NK.markers), .before = 1)

temp <- NK.markers[NK.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".NK.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

4.3.2.8 Mixed cells

Comparison between the mixed cell communities, and all other communities.


MIXED.markers <- FindMarkers(object = scRNAseqData, 
                          ident.1 = c("Mixed I", 
                                      "Mixed II"), 
                          ident.2 = c("CD14+CD68+ M I", 
                                      "CD14+CD68+ M II", 
                                      "CD14+CD68+ M III",
                                      "CD3+CD8+ T I",
                                      "CD3+CD8A+ T II", 
                                      "CD3+CD8A+ T III", 
                                      "CD3+CD4+ T I", 
                                      "CD3+CD4+ T II", 
                                      "CD3 Tregs",
                                      "CD34+ EC I", 
                                      "CD34+ EC II",
                                      # "Mixed I", 
                                      # "Mixed II", 
                                      "ACTA2+ SMC", 
                                      "NCAM1+ NK", 
                                      "KIT+ MC",
                                      "CD79A+ B I", 
                                      "CD79A+ B II"))

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~01m 31s      
  |++                                                | 2 % ~01m 25s      
  |++                                                | 3 % ~01m 20s      
  |+++                                               | 4 % ~01m 15s      
  |+++                                               | 5 % ~01m 12s      
  |++++                                              | 6 % ~01m 09s      
  |++++                                              | 7 % ~01m 08s      
  |+++++                                             | 8 % ~01m 07s      
  |+++++                                             | 9 % ~01m 05s      
  |++++++                                            | 10% ~01m 04s      
  |++++++                                            | 11% ~01m 02s      
  |+++++++                                           | 12% ~01m 01s      
  |+++++++                                           | 13% ~01m 00s      
  |++++++++                                          | 14% ~01m 01s      
  |++++++++                                          | 15% ~01m 00s      
  |+++++++++                                         | 16% ~59s          
  |+++++++++                                         | 17% ~58s          
  |++++++++++                                        | 18% ~57s          
  |++++++++++                                        | 19% ~56s          
  |+++++++++++                                       | 20% ~55s          
  |+++++++++++                                       | 21% ~54s          
  |++++++++++++                                      | 22% ~53s          
  |++++++++++++                                      | 23% ~52s          
  |+++++++++++++                                     | 24% ~51s          
  |+++++++++++++                                     | 26% ~50s          
  |++++++++++++++                                    | 27% ~50s          
  |++++++++++++++                                    | 28% ~49s          
  |+++++++++++++++                                   | 29% ~49s          
  |+++++++++++++++                                   | 30% ~48s          
  |++++++++++++++++                                  | 31% ~47s          
  |++++++++++++++++                                  | 32% ~46s          
  |+++++++++++++++++                                 | 33% ~45s          
  |+++++++++++++++++                                 | 34% ~44s          
  |++++++++++++++++++                                | 35% ~43s          
  |++++++++++++++++++                                | 36% ~43s          
  |+++++++++++++++++++                               | 37% ~43s          
  |+++++++++++++++++++                               | 38% ~42s          
  |++++++++++++++++++++                              | 39% ~41s          
  |++++++++++++++++++++                              | 40% ~40s          
  |+++++++++++++++++++++                             | 41% ~40s          
  |+++++++++++++++++++++                             | 42% ~39s          
  |++++++++++++++++++++++                            | 43% ~38s          
  |++++++++++++++++++++++                            | 44% ~37s          
  |+++++++++++++++++++++++                           | 45% ~36s          
  |+++++++++++++++++++++++                           | 46% ~36s          
  |++++++++++++++++++++++++                          | 47% ~35s          
  |++++++++++++++++++++++++                          | 48% ~34s          
  |+++++++++++++++++++++++++                         | 49% ~33s          
  |+++++++++++++++++++++++++                         | 50% ~33s          
  |++++++++++++++++++++++++++                        | 51% ~32s          
  |+++++++++++++++++++++++++++                       | 52% ~31s          
  |+++++++++++++++++++++++++++                       | 53% ~31s          
  |++++++++++++++++++++++++++++                      | 54% ~30s          
  |++++++++++++++++++++++++++++                      | 55% ~29s          
  |+++++++++++++++++++++++++++++                     | 56% ~29s          
  |+++++++++++++++++++++++++++++                     | 57% ~28s          
  |++++++++++++++++++++++++++++++                    | 58% ~27s          
  |++++++++++++++++++++++++++++++                    | 59% ~27s          
  |+++++++++++++++++++++++++++++++                   | 60% ~26s          
  |+++++++++++++++++++++++++++++++                   | 61% ~25s          
  |++++++++++++++++++++++++++++++++                  | 62% ~25s          
  |++++++++++++++++++++++++++++++++                  | 63% ~24s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~24s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~23s          
  |++++++++++++++++++++++++++++++++++                | 66% ~23s          
  |++++++++++++++++++++++++++++++++++                | 67% ~22s          
  |+++++++++++++++++++++++++++++++++++               | 68% ~21s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~21s          
  |++++++++++++++++++++++++++++++++++++              | 70% ~20s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~19s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~19s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~18s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~18s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~17s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~16s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~16s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~15s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~14s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~13s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~13s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~12s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~11s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~11s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~10s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~09s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~08s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~07s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~06s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~06s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~05s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=01m 09s
DT::datatable(MIXED.markers)

MIXED_Volcano_TargetsA = EnhancedVolcano(MIXED.markers,
    lab = rownames(MIXED.markers),
    x = "avg_log2FC",
    y = "p_val_adj",
    selectLab = target_genes_qc,
    axisLabSize = 12,
    xlab = "average fold-change",
    title = "Mixed markers\n(Mixed cell communities vs the rest)",
    titleLabSize = 14,
    pCutoff = 0.05/N_GENES, # 20552 genes
    FCcutoff = 1.25,
    pointSize = 1.5,
    labSize = 3.0,
    legendLabels=c('NS','avg. fold-change','P',
      'P & avg. fold-change'),
    legendPosition = "right",
    legendLabSize = 10,
    legendIconSize = 3.0,
    drawConnectors = TRUE,
    widthConnectors = 0.2,
    colConnectors = "#595A5C",
    gridlines.major = FALSE,
    gridlines.minor = FALSE)
Warning: One or more p-values is 0. Converting to 10^-1 * current lowest non-zero p-value...
# MIXED_Volcano_TargetsA
ggsave(paste0(PLOT_loc, "/", Today, ".Volcano.MIXED.DEG.Targets.pdf"), 
       plot = MIXED_Volcano_TargetsA)
Saving 7 x 7 in image

The target results are given below and written to a file.

library(tibble)
MIXED.markers <- add_column(MIXED.markers, Gene = row.names(MIXED.markers), .before = 1)

temp <- MIXED.markers[MIXED.markers$Gene %in% target_genes_qc,]

DT::datatable(temp)
fwrite(temp, file = paste0(OUT_loc, "/", Today, ".MIXED.DEG.Targets.txt"),
       quote = FALSE,
       sep = "\t", 
       showProgress = FALSE, verbose = FALSE)

5 Session information


Version:      v1.1.1
Last update:  2021-10-29
Written by:   Sander W. van der Laan (s.w.vanderlaan-2[at]umcutrecht.nl).
Description:  Script to load single-cell RNA sequencing (scRNAseq) data, and perform quality control (QC), and initial mapping to cells.
Minimum requirements: R version 3.5.2 (2018-12-20) -- 'Eggshell Igloo', macOS Mojave (10.14.2).

Change log
* v1.1.1 Update on the AEDB.
* v1.1.0 Major overhaul; update to WORCS system. Also including multiple options for scRNAseq datasets.
* v1.0.4 Small bug fixes.
* v1.0.3 Fixed weight further by excluding some graphs from the Rmd - obviously these can be added with sharing with third parties, but these are too heavy for a template.
* v1.0.2 Fixed weight of files (limit of 10Mb per file for templates). 
* v1.0.1 Updated background information.
* v1.0.0 Initial version.

sessionInfo()
R version 4.1.1 (2021-08-10)
Platform: x86_64-apple-darwin17.0 (64-bit)
Running under: macOS Monterey 12.0.1

Matrix products: default
LAPACK: /Library/Frameworks/R.framework/Versions/4.1/Resources/lib/libRlapack.dylib

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
 [1] parallel  stats4    tools     stats     graphics  grDevices datasets  utils     methods   base     

other attached packages:
 [1] RColorBrewer_1.1-2     labelled_2.8.0         openxlsx_4.2.4         SeuratObject_4.0.2     Seurat_4.0.3           devtools_2.4.2         usethis_2.0.1         
 [8] tableone_0.13.0        haven_2.4.3            EnhancedVolcano_1.10.0 ggrepel_0.9.1          mygene_1.28.0          GenomicFeatures_1.44.2 GenomicRanges_1.44.0  
[15] GenomeInfoDb_1.28.4    org.Hs.eg.db_3.13.0    AnnotationDbi_1.54.1   IRanges_2.26.0         S4Vectors_0.30.1       Biobase_2.52.0         BiocGenerics_0.38.0   
[22] DT_0.18                knitr_1.33             forcats_0.5.1          stringr_1.4.0          purrr_0.3.4            tibble_3.1.3           ggplot2_3.3.5         
[29] tidyverse_1.3.1        data.table_1.14.0      naniar_0.6.1           tidylog_1.0.2          tidyr_1.1.3            dplyr_1.0.7            optparse_1.6.6        
[36] readr_2.0.0           

loaded via a namespace (and not attached):
  [1] Hmisc_4.5-0                 ica_1.0-2                   class_7.3-19                ps_1.6.0                    Rsamtools_2.8.0             lmtest_0.9-38              
  [7] rprojroot_2.0.2             crayon_1.4.1                spatstat.core_2.3-0         MASS_7.3-54                 nlme_3.1-152                backports_1.2.1            
 [13] reprex_2.0.1                rlang_0.4.11                XVector_0.32.0              ROCR_1.0-11                 readxl_1.3.1                performance_0.7.3          
 [19] irlba_2.3.3                 nloptr_1.2.2.2              extrafontdb_1.0             callr_3.7.0                 filelock_1.0.2              proto_1.0.0                
 [25] extrafont_0.17              BiocParallel_1.26.2         rjson_0.2.20                bit64_4.0.5                 glue_1.4.2                  sjPlot_2.8.9               
 [31] sctransform_0.3.2           processx_3.5.2              vipor_0.4.5                 spatstat.sparse_2.0-0       UpSetR_1.4.0                spatstat.geom_2.2-2        
 [37] tidyselect_1.1.1            SummarizedExperiment_1.22.0 rio_0.5.27                  fitdistrplus_1.1-5          XML_3.99-0.8                zoo_1.8-9                  
 [43] proj4_1.0-10.1              ggpubr_0.4.0                sjmisc_2.8.7                GenomicAlignments_1.28.0    chron_2.3-56                xtable_1.8-4               
 [49] magrittr_2.0.1              evaluate_0.14               cli_3.0.1                   zlibbioc_1.38.0             rstudioapi_0.13             miniUI_0.1.1.1             
 [55] bslib_0.2.5.1               rpart_4.1-15                sjlabelled_1.1.8            maps_3.4.0                  shiny_1.6.0                 xfun_0.25                  
 [61] parameters_0.14.0           pkgbuild_1.2.0              cluster_2.1.2               KEGGREST_1.32.0             listenv_0.8.0               Biostrings_2.60.2          
 [67] png_0.1-7                   future_1.21.0               withr_2.4.2                 bitops_1.0-7                plyr_1.8.6                  cellranger_1.1.0           
 [73] e1071_1.7-9                 survey_4.1-1                coda_0.19-4                 pillar_1.6.2                cachem_1.0.5                fs_1.5.0                   
 [79] vctrs_0.3.8                 ellipsis_0.3.2              generics_0.1.0              gsubfn_0.7                  foreign_0.8-81              beeswarm_0.4.0             
 [85] munsell_0.5.0               proxy_0.4-26                emmeans_1.6.2-1             DelayedArray_0.18.0         fastmap_1.1.0               compiler_4.1.1             
 [91] pkgload_1.2.1               abind_1.4-5                 httpuv_1.6.1                rtracklayer_1.52.1          sessioninfo_1.1.1           plotly_4.9.4.1             
 [97] GenomeInfoDbData_1.2.6      gridExtra_2.3               lattice_0.20-44             deldir_0.2-10               utf8_1.2.2                  later_1.2.0                
[103] BiocFileCache_2.0.0         jsonlite_1.7.2              scales_1.1.1                pbapply_1.4-3               carData_3.0-4               estimability_1.3           
[109] renv_0.14.0                 lazyeval_0.2.2              promises_1.2.0.1            car_3.0-11                  latticeExtra_0.6-29         goftest_1.2-2              
[115] spatstat.utils_2.2-0        reticulate_1.20             effectsize_0.4.5            checkmate_2.0.0             rmarkdown_2.10              ash_1.0-15                 
[121] cowplot_1.1.1               textshaping_0.3.5           Rtsne_0.15                  pander_0.6.4                uwot_0.1.10                 igraph_1.2.6               
[127] survival_3.2-11             yaml_2.2.1                  systemfonts_1.0.2           htmltools_0.5.1.1           memoise_2.0.0               BiocIO_1.2.0               
[133] viridisLite_0.4.0           digest_0.6.27               assertthat_0.2.1            mime_0.11                   rappdirs_0.3.3              Rttf2pt1_1.3.9             
[139] bayestestR_0.10.5           RSQLite_2.2.8               sqldf_0.4-11                future.apply_1.7.0          remotes_2.4.0               blob_1.2.2                 
[145] ragg_1.1.3                  labeling_0.4.2              splines_4.1.1               Formula_1.2-4               RCurl_1.98-1.5              broom_0.7.9                
[151] hms_1.1.0                   modelr_0.1.8                colorspace_2.0-2            base64enc_0.1-3             BiocManager_1.30.16         ggbeeswarm_0.6.0           
[157] ggrastr_0.2.3               nnet_7.3-16                 sass_0.4.0                  Rcpp_1.0.7                  RANN_2.6.1                  mvtnorm_1.1-2              
[163] clisymbols_1.2.0            fansi_0.5.0                 tzdb_0.1.2                  parallelly_1.27.0           R6_2.5.0                    grid_4.1.1                 
[169] ggridges_0.5.3              lifecycle_1.0.0             zip_2.2.0                   datawizard_0.1.0            curl_4.3.2                  ggsignif_0.6.2             
[175] minqa_1.2.4                 jquerylib_0.1.4             leiden_0.3.9                testthat_3.0.4              getopt_1.20.3               Matrix_1.3-4               
[181] desc_1.3.0                  RcppAnnoy_0.0.19            htmlwidgets_1.5.3           polyclip_1.10-0             biomaRt_2.48.3              crosstalk_1.1.1            
[187] rvest_1.0.1                 mgcv_1.8-36                 globals_0.14.0              insight_0.14.2              htmlTable_2.2.1             patchwork_1.1.0.9000       
[193] codetools_0.2-18            matrixStats_0.61.0          lubridate_1.7.10            prettyunits_1.1.1           dbplyr_2.1.1                gtable_0.3.0               
[199] DBI_1.1.1                   visdat_0.5.3                tensor_1.5                  httr_1.4.2                  KernSmooth_2.23-20          stringi_1.7.3              
[205] progress_1.2.2              farver_2.1.0                reshape2_1.4.4              xml2_1.3.2                  boot_1.3-28                 ggeffects_1.1.1            
[211] ggalt_0.4.0                 lme4_1.1-27.1               restfulr_0.0.13             scattermore_0.7             bit_4.0.4                   sjstats_0.18.1             
[217] jpeg_0.1-9                  MatrixGenerics_1.4.3        spatstat.data_2.1-0         pkgconfig_2.0.3             rstatix_0.7.0               mitools_2.4                

6 Saving environment

save.image(paste0(PROJECT_loc, "/",Today,".",PROJECTNAME,".scrnaseq_results.RData"))
© 1979-2021 Sander W. van der Laan | s.w.vanderlaan-2[at]umcutrecht.nl | swvanderlaan.github.io.
LS0tCnRpdGxlOiAiTWFwcGluZyBnZW5lcyBvZiBpbnRlcmVzdCBhdCBzaW5nbGUtY2VsbCByZXNvbHV0aW9uIGluIGNhcm90aWQgcGxhcXVlcy4iCmF1dGhvcjogJ1tTYW5kZXIgVy4gdmFuIGRlciBMYWFuLCBQaERdKGh0dHBzOi8vc3d2YW5kZXJsYWFuLmdpdGh1Yi5pbykgfCBAc3d2YW5kZXJsYWFuJwpkYXRlOiAnYHIgU3lzLkRhdGUoKWAnCm91dHB1dDoKICBodG1sX25vdGVib29rOiAKICAgIGNhY2hlOiB5ZXMKICAgIGNvZGVfZm9sZGluZzogaGlkZQogICAgY29sbGFwc2U6IHllcwogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICBmaWcuYWxpZ246IGNlbnRlcgogICAgZmlnX2NhcHRpb246IHllcwogICAgZmlnX2hlaWdodDogMTAKICAgIGZpZ19yZXRpbmE6IDIKICAgIGZpZ193aWR0aDogMTIKICAgIG51bWJlcl9zZWN0aW9uczogeWVzCiAgICB0aGVtZTogcGFwZXIKICAgIHRvYzogeWVzCiAgICB0b2NfZmxvYXQ6CiAgICAgIGNvbGxhcHNlZDogbm8KICAgICAgc21vb3RoX3Njcm9sbDogeWVzCm1haW5mb250OiBIZWx2ZXRpY2EKc3VidGl0bGU6IEEgJ2RydWdnYWJsZS1NSS10YXJnZXRzJyBwcm9qZWN0CmVkaXRvcl9vcHRpb25zOgogIGNodW5rX291dHB1dF90eXBlOiBpbmxpbmUKICBtYXJrZG93bjogCiAgICB3cmFwOiA4MAotLS0KCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlPUZBTFNFfQojIGZ1cnRoZXIgZGVmaW5lIHNvbWUga25pdHItb3B0aW9ucy4Ka25pdHI6Om9wdHNfY2h1bmskc2V0KGZpZy53aWR0aCA9IDEyLCBmaWcuaGVpZ2h0ID0gOCwgZmlnLnBhdGggPSAnRmlndXJlcy8nLAogICAgICAgICAgICAgICAgICAgICAgZXZhbCA9IFRSVUUsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFKQpgYGAKCipDbGVhbiB0aGUgZW52aXJvbm1lbnQuKgoKYGBge3IgQ2xlYXJFbnZpcm9ubWVudCwgZWNobyA9IEZBTFNFfQpybShsaXN0ID0gbHMoKSkKYGBgCgoqU2V0IGxvY2F0aW9ucywgYW5kIHRoZSB3b3JraW5nIGRpcmVjdG9yeSAuLi4qCgpgYGB7ciBMb2NhbFN5c3RlbSwgZWNobyA9IEZBTFNFfQojIyMgT3BlcmF0aW5nIFN5c3RlbSBWZXJzaW9uCiMjIyBNYWNCb29rIFBybwojIFJPT1RfbG9jID0gIi9Vc2Vycy9zd3ZhbmRlcmxhYW4vT25lRHJpdmUgLSBVTUMgVXRyZWNodCIKCiMjIyBNYWNCb29rClJPT1RfbG9jID0gIi9Vc2Vycy9zbGFhbjMvT25lRHJpdmUgLSBVTUMgVXRyZWNodCIKR0VOT01JQ19sb2MgPSBwYXN0ZTAoUk9PVF9sb2MsICIvR2Vub21pY3MiKQpTVE9SQUdFX2xvYyA9ICIvVm9sdW1lcy9MYUNpZSIKCiMjIyBHZW5lcmljIExvY2F0aW9ucwpBRURCX2xvYyA9IHBhc3RlMChHRU5PTUlDX2xvYywgIi9BdGhlcm8tRXhwcmVzcy9BRS1BQUFfR1NfREJzIikKTEFCX2xvYyA9IHBhc3RlMChHRU5PTUlDX2xvYywgIi9MYWJCdXNpbmVzcyIpClBMSU5LX2xvYz1wYXN0ZTAoU1RPUkFHRV9sb2MsIi9QTElOSyIpCgpBRUdTUUNfbG9jID0gIHBhc3RlMChQTElOS19sb2MsICIvX0FFX09SSUdJTkFMUy9BRUdTX0NPTUJJTkVEX1FDMjAxOCIpCk1JQ0hJTVBfbG9jPXBhc3RlMChQTElOS19sb2MsIi9fQUVfT1JJR0lOQUxTL0FFR1NfQ09NQklORURfRUFHTEUyXzEwMDBHcDN2NUhSQ3IxMSIpCgpSQVdEQVRBID0gcGFzdGUwKFBMSU5LX2xvYywgIi9fQUVfT1JJR0lOQUxTL0FFU0NSTkEvcHJlcHBlZF9kYXRhIikKClBST0pFQ1RST09UX2xvYyA9IHBhc3RlMChQTElOS19sb2MsICIvYW5hbHlzZXMvbG9va3Vwcy9BRV9URU1QTEFURSIpClJFU1VMVFMgPSBwYXN0ZTAoUFJPSkVDVFJPT1RfbG9jLCAiL3NjUk5Bc2VxIikKUFJPSkVDVF9sb2MgPSBwYXN0ZTAoUFJPSkVDVFJPT1RfbG9jLCAiL3NjUk5Bc2VxIikKCiMgdXNlIHRoaXMgaWYgdGhlcmUgaXMgcmVsZXZhbnQgaW5mb3JtYXRpb24gaGVyZS4KVEFSR0VUX2xvYyA9IHBhc3RlMChHRU5PTUlDX2xvYywgIi9BdGhlcm8tRXhwcmVzcy9Gb3Jtcy9bWUVBUl0vQUVfVEVNUExBVEUiKQoKIyMjIFNPTUUgVkFSSUFCTEVTIFdFIE5FRUQgRE9XTiBUSEUgTElORQpjYXQoIlxuRGVmaW5pbmcgcGhlbm90eXBlcyBhbmQgZGF0YXNldHMuXG4iKQpQUk9KRUNUTkFNRT0iQUVTQ1JOQSIKVEFSR0VUX0dFTkVTID0gIlBDU0s5IiAjIFBoZW5vdHlwZQpUQVJHRVRfQT0iUENTSzkiClRBUkdFVF9CPSJDT0w0QTIiCgpjYXQoIlxuQ3JlYXRlIGEgbmV3IGFuYWx5c2lzIGRpcmVjdG9yeSwgaW5jbHVkaW5nIHN1YmRpcmVjdG9yaWVzLlxuIikKIyBBbmFseXNpcwppZmVsc2UoIWRpci5leGlzdHMoZmlsZS5wYXRoKFBST0pFQ1RfbG9jLCAiLyIsUFJPSkVDVE5BTUUpKSwgCiAgICAgICBkaXIuY3JlYXRlKGZpbGUucGF0aChQUk9KRUNUX2xvYywgIi8iLFBST0pFQ1ROQU1FKSksIAogICAgICAgRkFMU0UpCkFOQUxZU0lTX2xvYyA9IHBhc3RlMChQUk9KRUNUX2xvYywiLyIsUFJPSkVDVE5BTUUpCgojIFBsb3RzCmlmZWxzZSghZGlyLmV4aXN0cyhmaWxlLnBhdGgoQU5BTFlTSVNfbG9jLCAiL1BMT1RTIikpLCAKICAgICAgIGRpci5jcmVhdGUoZmlsZS5wYXRoKEFOQUxZU0lTX2xvYywgIi9QTE9UUyIpKSwgCiAgICAgICBGQUxTRSkKUExPVF9sb2MgPSBwYXN0ZTAoQU5BTFlTSVNfbG9jLCIvUExPVFMiKQoKIyBRQyBwbG90cwppZmVsc2UoIWRpci5leGlzdHMoZmlsZS5wYXRoKFBMT1RfbG9jLCAiL1FDIikpLCAKICAgICAgIGRpci5jcmVhdGUoZmlsZS5wYXRoKFBMT1RfbG9jLCAiL1FDIikpLCAKICAgICAgIEZBTFNFKQpRQ19sb2MgPSBwYXN0ZTAoUExPVF9sb2MsIi9RQyIpCgojIE91dHB1dCBmaWxlcwppZmVsc2UoIWRpci5leGlzdHMoZmlsZS5wYXRoKEFOQUxZU0lTX2xvYywgIi9PVVRQVVQiKSksIAogICAgICAgZGlyLmNyZWF0ZShmaWxlLnBhdGgoQU5BTFlTSVNfbG9jLCAiL09VVFBVVCIpKSwgCiAgICAgICBGQUxTRSkKT1VUX2xvYyA9IHBhc3RlMChBTkFMWVNJU19sb2MsICIvT1VUUFVUIikKCmNhdCgiXG5TZXR0aW5nIHdvcmtpbmcgZGlyZWN0b3J5IGFuZCBsaXN0aW5nIGl0cyBjb250ZW50cy5cbiIpCnNldHdkKHBhc3RlMChQUk9KRUNUX2xvYykpCmdldHdkKCkKbGlzdC5maWxlcygpCmBgYAoKKi4uLiBhIHBhY2thZ2UtaW5zdGFsbGF0aW9uIGZ1bmN0aW9uIC4uLioKCmBgYHtyIEZ1bmN0aW9uOiBpbnN0YWxsYXRpb25zLCBlY2hvPUZBTFNFfQppbnN0YWxsLnBhY2thZ2VzLmF1dG8gPC0gZnVuY3Rpb24oeCkgeyAKICB4IDwtIGFzLmNoYXJhY3RlcihzdWJzdGl0dXRlKHgpKSAKICBpZihpc1RSVUUoeCAlaW4lIC5wYWNrYWdlcyhhbGwuYXZhaWxhYmxlID0gVFJVRSkpKSB7IAogICAgZXZhbChwYXJzZSh0ZXh0ID0gc3ByaW50ZigicmVxdWlyZShcIiVzXCIpIiwgeCkpKQogIH0gZWxzZSB7IAogICAgIyBVcGRhdGUgaW5zdGFsbGVkIHBhY2thZ2VzIC0gdGhpcyBtYXkgbWVhbiBhIGZ1bGwgdXBncmFkZSBvZiBSLCB3aGljaCBpbiB0dXJuCiAgICAjIG1heSBub3QgYmUgd2FycmVudGVkLiAKICAgICMgdXBkYXRlLmluc3RhbGwucGFja2FnZXMuYXV0byhhc2sgPSBGQUxTRSkgCiAgICBldmFsKHBhcnNlKHRleHQgPSBzcHJpbnRmKCJpbnN0YWxsLnBhY2thZ2VzKFwiJXNcIiwgZGVwZW5kZW5jaWVzID0gVFJVRSwgcmVwb3MgPSBcImh0dHBzOi8vY2xvdWQuci1wcm9qZWN0Lm9yZy9cIikiLCB4KSkpCiAgfQogIGlmKGlzVFJVRSh4ICVpbiUgLnBhY2thZ2VzKGFsbC5hdmFpbGFibGUgPSBUUlVFKSkpIHsgCiAgICBldmFsKHBhcnNlKHRleHQgPSBzcHJpbnRmKCJyZXF1aXJlKFwiJXNcIikiLCB4KSkpCiAgfSBlbHNlIHsKICAgIGlmICghcmVxdWlyZU5hbWVzcGFjZSgiQmlvY01hbmFnZXIiKSkKICAgICAgaW5zdGFsbC5wYWNrYWdlcygiQmlvY01hbmFnZXIiKQogICAgIyBCaW9jTWFuYWdlcjo6aW5zdGFsbCgpICMgdGhpcyB3b3VsZCBlbnRhaWwgdXBkYXRpbmcgaW5zdGFsbGVkIHBhY2thZ2VzLCB3aGljaCBpbiB0dXJuZWQgbWF5IG5vdCBiZSB3YXJyZW50ZWQKICAgIGV2YWwocGFyc2UodGV4dCA9IHNwcmludGYoIkJpb2NNYW5hZ2VyOjppbnN0YWxsKFwiJXNcIikiLCB4KSkpCiAgICBldmFsKHBhcnNlKHRleHQgPSBzcHJpbnRmKCJyZXF1aXJlKFwiJXNcIikiLCB4KSkpCiAgfQp9CmBgYAoKKi4uLiBhbmQgbG9hZCB0aG9zZSBwYWNrYWdlcy4qCgpgYGB7ciBTZXR0aW5nOiBsb2FkaW5nX3BhY2thZ2VzLCBlY2hvPUZBTFNFLCBtZXNzYWdlPUZBTFNFLCB3YXJuaW5nPUZBTFNFfQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oInJlYWRyIikKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJvcHRwYXJzZSIpCmluc3RhbGwucGFja2FnZXMuYXV0bygidG9vbHMiKQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oImRwbHlyIikKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJ0aWR5ciIpCmluc3RhbGwucGFja2FnZXMuYXV0bygidGlkeWxvZyIpCmxpYnJhcnkoInRpZHlsb2ciLCB3YXJuLmNvbmZsaWN0cyA9IEZBTFNFKQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oIm5hbmlhciIpCgojIFRvIGdldCAnZGF0YS50YWJsZScgd2l0aCAnZndyaXRlJyB0byBiZSBhYmxlIHRvIGRpcmVjdGx5IHdyaXRlIGd6aXBwZWQtZmlsZXMKIyBSZWY6IGh0dHBzOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzQyNzg4NDAxL2lzLXBvc3NpYmxlLXRvLXVzZS1md3JpdGUtZnJvbS1kYXRhLXRhYmxlLXdpdGgtZ3pmaWxlCiMgaW5zdGFsbC5wYWNrYWdlcygiZGF0YS50YWJsZSIsIHJlcG9zID0gImh0dHBzOi8vUmRhdGF0YWJsZS5naXRsYWIuaW8vZGF0YS50YWJsZSIpCmxpYnJhcnkoZGF0YS50YWJsZSkKCmluc3RhbGwucGFja2FnZXMuYXV0bygidGlkeXZlcnNlIikKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJrbml0ciIpCmluc3RhbGwucGFja2FnZXMuYXV0bygiRFQiKQoKaW5zdGFsbC5wYWNrYWdlcy5hdXRvKCJvcmcuSHMuZWcuZGIiKQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oIm15Z2VuZSIpCmluc3RhbGwucGFja2FnZXMuYXV0bygiRW5oYW5jZWRWb2xjYW5vIikKCmluc3RhbGwucGFja2FnZXMuYXV0bygiaGF2ZW4iKQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oInRhYmxlb25lIikKCgojIEluc3RhbGwgdGhlIGRldnRvb2xzIHBhY2thZ2UgZnJvbSBIYWRsZXkgV2lja2hhbQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oJ2RldnRvb2xzJykKIyBSZXBsYWNlICcyLjMuNCcgd2l0aCB5b3VyIGRlc2lyZWQgdmVyc2lvbgojIGRldnRvb2xzOjppbnN0YWxsX3ZlcnNpb24ocGFja2FnZSA9ICdTZXVyYXQnLCB2ZXJzaW9uID0gcGFja2FnZV92ZXJzaW9uKCcyLjMuNCcpKQppbnN0YWxsLnBhY2thZ2VzLmF1dG8oIlNldXJhdCIpICMgbGF0ZXN0IHZlcnNpb24KbGlicmFyeSgiU2V1cmF0IikKCmBgYAoKKldlIHdpbGwgY3JlYXRlIGEgZGF0ZXN0YW1wIGFuZCBkZWZpbmUgdGhlIFV0cmVjaHQgU2NpZW5jZSBQYXJrIENvbG91ciBTY2hlbWUqLgoKYGBge3IgU2V0dGluZzogQ29sb3JzLCBlY2hvPUZBTFNFfQoKVG9kYXkgPSBmb3JtYXQoYXMuRGF0ZShhcy5QT1NJWGx0KFN5cy50aW1lKCkpKSwgIiVZJW0lZCIpClRvZGF5LlJlcG9ydCA9IGZvcm1hdChhcy5EYXRlKGFzLlBPU0lYbHQoU3lzLnRpbWUoKSkpLCAiJUEsICVCICVkLCAlWSIpCgojIyMgVXRyZWNodFNjaWVuY2VQYXJrQ29sb3Vyc1NjaGVtZQojIyMKIyMjIFdlYnNpdGV0b2NvbnZlcnRIRVh0b1JHQjpodHRwOi8vaGV4LmNvbG9ycnJzLmNvbS4KIyMjIEZvcnNvbWVmdW5jdGlvbnN5b3VzaG91bGRkaXZpZGV0aGVzZW51bWJlcnNieTI1NS4KIyMjIAojIyMJTm8uCUNvbG9yCQkJICAgICAgSEVYCShSR0IpCQkJCQkJICAgICAgICAgICAgICBDSFIJCSAgTUFGL0lORk8KIyMjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiMjIwkxCSAgeWVsbG93CQkJICAgICNGQkI4MjAgKDI1MSwxODQsMzIpCQkJCSAgICAgID0+CTEJCW9yIDEuMD5JTkZPCiMjIwkyCSAgZ29sZAkJCSAgICAgICNGNTlEMTAgKDI0NSwxNTcsMTYpCQkJCSAgICAgID0+CTIJCQojIyMJMwkgIHNhbG1vbgkJCSAgICAjRTU1NzM4ICgyMjksODcsNTYpCQkJCSAgICAgID0+CTMJCW9yIDAuMDU8TUFGPDAuMiBvciAwLjQ8SU5GTzwwLjYKIyMjCTQJICBkYXJrcGluawkJICAgICNEQjAwM0YgKCgyMTksMCw2MykJCQkJICAgICAgPT4JNAkJCiMjIwk1CSAgbGlnaHRwaW5rCQkgICAgI0UzNTQ5MyAoMjI3LDg0LDE0NykJCQkJICAgICAgPT4JNQkJb3IgMC44PElORk88MS4wCiMjIwk2CSAgcGluawkJCSAgICAgICNENTI2N0IgKDIxMywzOCwxMjMpCQkJCSAgICAgID0+CTYJCQojIyMJNwkgIGhhcmRwaW5rCQkgICAgI0NDMDA3MSAoMjA0LDAsMTEzKQkJCQkgICAgICA9Pgk3CQkKIyMjCTgJICBsaWdodHB1cnBsZQkgICAgI0E4NDQ4QSAoMTY4LDY4LDEzOCkJCQkJICAgICAgPT4JOAkJCiMjIwk5CSAgcHVycGxlCQkJICAgICM5QTM0ODAgKDE1NCw1MiwxMjgpCQkJCSAgICAgID0+CTkJCQojIyMJMTAJbGF2ZW5kZWwJCSAgICAjOEQ1QjlBICgxNDEsOTEsMTU0KQkJCQkgICAgICA9PgkxMAkJCiMjIwkxMQlibHVlcHVycGxlCQkgICM3MDUyOTYgKDExMiw4MiwxNTApCQkJCSAgICAgID0+CTExCQkKIyMjCTEyCXB1cnBsZWJsdWUJCSAgIzY4NkFBOSAoMTA0LDEwNiwxNjkpCQkJICAgICAgPT4JMTIJCQojIyMJMTMJbGlnaHRwdXJwbGVibHVlCSM2MTczQUQgKDk3LDExNSwxNzMvMTAxLDEyMCwxODApCT0+CTEzCQkKIyMjCTE0CXNlYWJsdWUJCQkgICAgIzRDODFCRiAoNzYsMTI5LDE5MSkJCQkJICAgICAgPT4JMTQJCQojIyMJMTUJc2t5Ymx1ZQkJCSAgICAjMkY4QkM5ICg0NywxMzksMjAxKQkJCQkgICAgICA9PgkxNQkJCiMjIwkxNglhenVyYmx1ZQkJICAgICMxMjkwRDkgKDE4LDE0NCwyMTcpCQkJCSAgICAgID0+CTE2CQlvciAwLjAxPE1BRjwwLjA1IG9yIDAuMjxJTkZPPDAuNAojIyMJMTcJbGlnaHRhenVyYmx1ZQkgICMxMzk2RDggKDE5LDE1MCwyMTYpCQkJCSAgICAgID0+CTE3CQkKIyMjCTE4CWdyZWVuYmx1ZQkJICAgICMxNUE2QzEgKDIxLDE2NiwxOTMpCQkJCSAgICAgID0+CTE4CQkKIyMjCTE5CXNlYXdlZWRncmVlbgkgICM1RUIxN0YgKDk0LDE3NywxMjcpCQkJCSAgICAgID0+CTE5CQkKIyMjCTIwCXllbGxvd2dyZWVuCQkgICM4NkI4MzMgKDEzNCwxODQsNTEpCQkJCSAgICAgID0+CTIwCQkKIyMjCTIxCWxpZ2h0bW9zc2dyZWVuCSNDNUQyMjAgKDE5NywyMTAsMzIpCQkJCSAgICAgID0+CTIxCQkKIyMjCTIyCW1vc3NncmVlbgkJICAgICM5RkMyMjggKDE1OSwxOTQsNDApCQkJCSAgICAgID0+CTIyCQlvciBNQUY+MC4yMCBvciAwLjY8SU5GTzwwLjgKIyMjCTIzCWxpZ2h0Z3JlZW4JICAJIzc4QjExMyAoMTIwLDE3NywxOSkJCQkJICAgICAgPT4JMjMvWAojIyMJMjQJZ3JlZW4JCQkgICAgICAjNDlBMDFEICg3MywxNjAsMjkpCQkJCSAgICAgID0+CTI0L1kKIyMjCTI1CWdyZXkJCQkgICAgICAjNTk1QTVDICg4OSw5MCw5MikJCQkJICAgICAgICA9PgkyNS9YWQlvciBNQUY8MC4wMSBvciAwLjA8SU5GTzwwLjIKIyMjCTI2CWxpZ2h0Z3JleQkJICAgICNBMkEzQTQJKDE2MiwxNjMsMTY0KQkJCSAgICAgID0+CTI2L01UCiMjIwojIyMJQURESVRJT05BTCBDT0xPUlMKIyMjCTI3CW1pZGdyZXkJCQkjRDdEOEQ3CiMjIwkyOAl2ZXJ5bGlnaHRncmV5CSNFQ0VDRUMiCiMjIwkyOQl3aGl0ZQkJCSNGRkZGRkYKIyMjCTMwCWJsYWNrCQkJIzAwMDAwMAojIyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgp1aXRob2ZfY29sb3IgPSBjKCIjRkJCODIwIiwiI0Y1OUQxMCIsIiNFNTU3MzgiLCIjREIwMDNGIiwiI0UzNTQ5MyIsIiNENTI2N0IiLAogICAgICAgICAgICAgICAgICIjQ0MwMDcxIiwiI0E4NDQ4QSIsIiM5QTM0ODAiLCIjOEQ1QjlBIiwiIzcwNTI5NiIsIiM2ODZBQTkiLAogICAgICAgICAgICAgICAgICIjNjE3M0FEIiwiIzRDODFCRiIsIiMyRjhCQzkiLCIjMTI5MEQ5IiwiIzEzOTZEOCIsIiMxNUE2QzEiLAogICAgICAgICAgICAgICAgICIjNUVCMTdGIiwiIzg2QjgzMyIsIiNDNUQyMjAiLCIjOUZDMjI4IiwiIzc4QjExMyIsIiM0OUEwMUQiLAogICAgICAgICAgICAgICAgICIjNTk1QTVDIiwiI0EyQTNBNCIsICIjRDdEOEQ3IiwgIiNFQ0VDRUMiLCAiI0ZGRkZGRiIsICIjMDAwMDAwIikKCnVpdGhvZl9jb2xvcl9sZWdlbmQgPSBjKCIjRkJCODIwIiwgIiNGNTlEMTAiLCAiI0U1NTczOCIsICIjREIwMDNGIiwgIiNFMzU0OTMiLAogICAgICAgICAgICAgICAgICAgICAgICAiI0Q1MjY3QiIsICIjQ0MwMDcxIiwgIiNBODQ0OEEiLCAiIzlBMzQ4MCIsICIjOEQ1QjlBIiwKICAgICAgICAgICAgICAgICAgICAgICAgIiM3MDUyOTYiLCAiIzY4NkFBOSIsICIjNjE3M0FEIiwgIiM0QzgxQkYiLCAiIzJGOEJDOSIsCiAgICAgICAgICAgICAgICAgICAgICAgICIjMTI5MEQ5IiwgIiMxMzk2RDgiLCAiIzE1QTZDMSIsICIjNUVCMTdGIiwgIiM4NkI4MzMiLAogICAgICAgICAgICAgICAgICAgICAgICAiI0M1RDIyMCIsICIjOUZDMjI4IiwgIiM3OEIxMTMiLCAiIzQ5QTAxRCIsICIjNTk1QTVDIiwKICAgICAgICAgICAgICAgICAgICAgICAgIiNBMkEzQTQiLCAiI0Q3RDhENyIsICIjRUNFQ0VDIiwgIiNGRkZGRkYiLCAiIzAwMDAwMCIpCgojZ2dwbG90MiBkZWZhdWx0IGNvbG9yIHBhbGV0dGUKZ2dfY29sb3JfaHVlIDwtIGZ1bmN0aW9uKG4pIHsKICBodWVzID0gc2VxKDE1LCAzNzUsIGxlbmd0aCA9IG4gKyAxKQogIGhjbChoID0gaHVlcywgbCA9IDY1LCBjID0gMTAwKVsxOm5dCn0KCiMjIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmBgYAoKIyBFUkEtQ1ZEICdkcnVnZ2FibGUtTUktdGFyZ2V0cycKCjwhLS0gIVtFUkEtQ1ZEIGxvZ29dKCJVc2Vycy9zd3ZhbmRlcmxhYW4vaUNsb3VkL0dlbm9taWNzL1Byb2plY3RzLyNEcnVnZ2FibGUtTUktR2VuZXMvQWRtaW5pc3RyYXRpb24vRVJBLUNWRFwgTG9nb19DTVlLLmpwZyIpIC0tPgoKRm9yIHRoZSBFUkEtQ1ZEICdkcnVnZ2FibGUtTUktdGFyZ2V0cycgcHJvamVjdCAoZ3JhbnRudW1iZXI6IDAxS0wxODAyKSB3ZSB3aWxsCnBlcmZvcm0gdHdvIHJlbGF0ZWQgUk5BIHNlcXVlbmNpbmcgKFJOQXNlcSkgZXhwZXJpbWVudHM6CgoxKSAgY29udmVudGlvbmFsICgnYnVsaycpIFJOQXNlcSB1c2luZyBSTkEgZXh0cmFjdGVkIGZyb20gY2Fyb3RpZCBwbGFxdWUKICAgIHNhbXBsZXMsIG4gwrEgNzAwLiBBcyBvZiBgciBUb2RheS5SZXBvcnRgIGFsbCBzYW1wbGVzIGhhdmUgYmVlbiBzZWxlY3RlZCBhbmQKICAgIFJOQSBoYXMgYmVlbiBleHRyYWN0ZWQ7IHF1YWxpdHkgY29udHJvbCAoUUMpIHdhcyBwZXJmb3JtZWQgYW5kIHdlIGhhdmUgYQogICAgZGF0YXNldCBvZiA2MzUgc2FtcGxlcy4KCjIpICBzaW5nbGUtY2VsbCBSTkFzZXEgKHNjUk5Bc2VxKSBvZiBhdCBsZWFzdCBuID0gNDAgc2FtcGxlcyAoMjAgZmVtYWxlcywgMjAKICAgIG1hbGVzKS4gQXMgb2YgYHIgVG9kYXkuUmVwb3J0YCBkYXRhIGlzIGF2YWlsYWJsZSBvZiA0MCBzYW1wbGVzICgzIGZlbWFsZXMsCiAgICAxNSBtYWxlcyksIHdlIGFyZSBleHRlbmRpbmcgc2FtcGxpbmcgdG8gZ2V0IG1vcmUgZmVtYWxlIHNhbXBsZXMuCgpQbGFxdWUgc2FtcGxlcyBhcmUgZGVyaXZlZCBmcm9tIGNhcm90aWQgZW5kYXJ0ZXJlY3RvbWllcyBhcyBwYXJ0IG9mIHRoZQpbQXRoZXJvLUV4cHJlc3MgQmlvYmFuayBTdHVkeV0oaHR0cDp3d3cvYXRoZXJvZXhwcmVzcy5ubCkgd2hpY2ggaXMgYW4gb25nb2luZwpzdHVkeSBpbiB0aGUgVU1DIFV0cmVjaHQuCgojIEJhY2tncm91bmQKCkNvbGxhYm9yYXRpb24gdG8gc3R1ZHkgZ2VuZSBleHByZXNzaW9uIG9mIGByIFRBUkdFVF9HRU5FU2AgaW4gcmVsYXRpb24gdG8KYXRoZXJvc2NsZXJvdGljIHBsYXF1ZXMgY2hhcmFjdGVyaXN0aWNzLiBUaGUgbWFpbiBsaXN0IG9mIGdlbmVzIGFyZSBnaXZlbiBiZWxvdy4KCi0gICBgR2VuZXMueGxzeGAKCmBgYHtyIHRhcmdldHN9CmxpYnJhcnkob3Blbnhsc3gpCgojIE1hbnVhbCBvcHRpb24KIyBnZW5lX2xpc3QgPC0gYygiUENTSzkiLCAiQ09MNEExIiwgIkNPTDRBMiIsICJDT0wzQSIsICJDT0wyQSIsICJMRExSIiwgIkNEMzYiKQojIGdlbmVfbGlzdAoKZ2VuZV9saXN0IDwtIHJlYWQueGxzeChwYXN0ZTAoUFJPSkVDVFJPT1RfbG9jLCAiL1NOUC9HZW5lcy54bHN4IiksIHNoZWV0ID0gIkdlbmVzIikKCkRUOjpkYXRhdGFibGUoZ2VuZV9saXN0KQoKdGFyZ2V0X2dlbmVzIDwtIHVubGlzdChnZW5lX2xpc3QkR2VuZSkKdGFyZ2V0X2dlbmVzCgpgYGAKCiMgTG9hZCBkYXRhCgpGaXJzdCB3ZSB3aWxsIGxvYWQgdGhlIGRhdGE6CgotICAgc2NSTkFzZXEgZXhwZXJpbWVudGFsIGRhdGEgYW5kIHJlbmFtZSB0aGUgY2VsbCB0eXBlcy4KLSAgIEF0aGVyby1FeHByZXNzIGNsaW5pY2FsIGRhdGEuCgojIyBBRVNDUk5BOiBzaW5nbGUtY2VsbCBSTkFzZXEgZnJvbSBjYXJvdGlkIHBsYXF1ZXMKCkhlcmUgd2UgbG9hZCB0aGUgbGF0ZXN0IGRhdGFzZXQgZnJvbSBvdXIgQXRoZXJvLUV4cHJlc3MgU2luZ2xlIENlbGwgUk5BCmV4cGVyaW1lbnQuCgpUaGVyZSBhcmUgZmV3IGRhdGFzZXRzIGF2YWlsYWJsZToKCi0gICAyMDIxMDMxNl9DaXJjUmVzMjAyMF8xOHB0cy5SRFMgXD4gdGhlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIFtEZXB1eWR0IE0uQS5DIGV0CiAgICBhbC5dKGh0dHBzOi8vZG9pLm9yZy8xMC4xMTYxL0NJUkNSRVNBSEEuMTIwLjMxNjc3MCkKLSAgIDIwMjAwNzAxX3NldXJhdF8zN19wdHMuUkRTIFw+IHRoZSBkYXRhIG9mIDM3IHBhdGllbnRzCi0gICAyMDIxMDIxN19QbGFxVmlld18zOF9wdHMuUkRTIFw+IHRoZSBkYXRhIGFzc29jaWF0ZWQgd2l0aAogICAgW1BsYXFWaWV3XShodHRwczovL3d3dy5wbGFxdmlldy5jb20pOyB0aGlzIGNhbiAqbm90KiBiZSBjb3VwbGUgdG8gc3R1ZHkKICAgIG51bWJlcnMKLSAgIDIwMjEwODExXzQ2X3BhdGllbnRzX0tvZW4uUkRTIFw+IHRoZSBsYXRlc3QgZGF0YXNldCAtIE5PVEU6IGZhaWxlcyB0byBvcGVuCiAgICAndW5rbm93biBpbnB1dCBmb3JtYXQnCgpIZXJlIHdlIHVzZSB0aGUgUGxhcVZpZXcgZGF0YS4KCmBgYHtyIExvYWREYXRhfQoKc2NSTkFzZXFEYXRhIDwtIHJlYWRSRFMocGFzdGUwKFJBV0RBVEEsICIvU2V1c2V0XzQwX3BhdGllbnRzL3NldXJhdF8zN19wdHNfMjAyMDA3MDEuUkRTIikpCnNjUk5Bc2VxRGF0YQpOX0dFTkVTPTE4MjgzCmBgYAoKVGhlIG5hbWluZy9jbGFzc2lmaWNhdGlvbiBpcyBiYXNlZCBvbiBhIGNvbWJpbmF0aW9uIGNvbnZlbnRpb25hbCBtYXJrZXJzLiBXZSBkbwpub3QgY2xhaW0gdG8ga25vdyB0aGUgZXhhY3QgaWRlbnRpdHkgb2YgZWFjaCBjZWxsLCByYXRoZXIgd2UgcmVmZXIgdG8gY2VsbHMgYXMKJ0tJVCsgTWFzdCBjZWxscyItbGlrZSBjZWxscy4gTGlrZXdpc2Ugd2UgcmVmZXIgdG8gdGhlIGNlbGwgY2x1c3RlcnMgYXMKJ2NvbW11bml0aWVzJyBvZiBjZWxscyB0aGF0IGV4aWhpYml0IHNpbWlsYXIgcHJvcGVydGllcywgKmkuZS4qIHNpbWlsYXIgZGVmaW5pbmcKbWFya2VycyAoKmUuZy4gS0lUKikuCgpXZSB3aWxsIHJlbmFtZSB0aGUgY2VsbCB0eXBlcyB0byBodW1hbiByZWFkYWJsZSBuYW1lcy4KCmBgYHtyIENoYW5nZSBjZWxsIGN1bW11bml0eSBuYW1lc30KIyMjIGNoYW5nZSBuYW1lcyBmb3IgY2xhcml0eQpiYWNrdXAuc2NSTkFzZXFEYXRhID0gc2NSTkFzZXFEYXRhCiMgZ2V0IHRoZSBvbGQgbmFtZXMgdG8gY2hhbmdlIHRvIG5ldyBuYW1lcwpVTUFQUGxvdChzY1JOQXNlcURhdGEsIGxhYmVsID0gRkFMU0UsIHB0LnNpemUgPSAxLjI1LCBsYWJlbC5zaXplID0gNCwgZ3JvdXAuYnkgPSAiaWRlbnQiKQoKbGV2ZWxzKHVuaXF1ZShzY1JOQXNlcURhdGFAYWN0aXZlLmlkZW50KSkKIyBbMV0gIkNEMytDRDhBKyBUIGNlbGxzIEkiICAgICAgICAgIkNEMytDRDhBKyBUIGNlbGxzIElJSSIgICAgICAgIkNEMytDRDQrIFQgQ2VsbHMgSSIgICAgICAgICAgIkNEMTQrQ0Q2OCsgTWFjcm9waGFnZXMgSSIgICAKIyBbNV0gIk1peGVkIENlbGxzIEkiICAgICAgICAgICAgICAgIkNEMytDRDhBKyBUIENlbGxzIElJIiAgICAgICAgIkNEMTQrQ0Q2OCsgTWFjcm9waGFnZXMgSUkiICAgIkNEMytDRDQrIFQgQ2VsbHMgSUkiICAgICAgICAKIyBbOV0gIkFDVEEyKyBTbW9vdGggTXVzY2xlIENlbGxzIiAgIkNEMzQrIEVuZG90aGVsaWFsIENlbGxzIEkiICAgIkNEMzQrIEVuZG90aGVsaWFsIENlbGxzIElJIiAgIk5DQU0xKyBOYXR1cmFsIEtpbGxlciBDZWxscyIKI1sxM10gIk1peGVkIENlbGxzIElJIiAgICAgICAgICAgICAgIkNENzlBKyBCIENlbGxzIEkiICAgICAgICAgICAgIkNEMTQrQ0Q2OCsgTWFjcm9waGFnZXMgSUlJIiAgIkNEMysgUmVndWxhdG9yeSBUIENlbGxzIiAgICAKI1sxN10gIktJVCsgTWFzdCBDZWxscyIgICAgICAgICAgICAgIkNENzlBKyBCIENlbGxzIElJIiAgCgpjZWxsdHlwZXMgPC0gYygiQ0QxNCtDRDY4KyBNYWNyb3BoYWdlcyBJIiA9ICJDRDE0K0NENjgrIE0gSSIsIAogICAgICAgICAgICAgICAiQ0QxNCtDRDY4KyBNYWNyb3BoYWdlcyBJSSIgPSAiQ0QxNCtDRDY4KyBNIElJIiwgCiAgICAgICAgICAgICAgICJDRDE0K0NENjgrIE1hY3JvcGhhZ2VzIElJSSIgPSAiQ0QxNCtDRDY4KyBNIElJSSIsCiAgICAgICAgICAgICAgICJDRDMrQ0Q4QSsgVCBjZWxscyBJIiA9ICJDRDMrQ0Q4KyBUIEkiLAogICAgICAgICAgICAgICAiQ0QzK0NEOEErIFQgQ2VsbHMgSUkiID0gIkNEMytDRDhBKyBUIElJIiwKICAgICAgICAgICAgICAgIkNEMytDRDhBKyBUIGNlbGxzIElJSSIgPSAiQ0QzK0NEOEErIFQgSUlJIiwKICAgICAgICAgICAgICAgIkNEMytDRDQrIFQgQ2VsbHMgSSIgPSAiQ0QzK0NENCsgVCBJIiwgCiAgICAgICAgICAgICAgICJDRDMrQ0Q0KyBUIENlbGxzIElJIiA9ICJDRDMrQ0Q0KyBUIElJIiwgCiAgICAgICAgICAgICAgICJDRDMrIFJlZ3VsYXRvcnkgVCBDZWxscyIgPSAiQ0QzIFRyZWdzIiwgCiAgICAgICAgICAgICAgICJDRDM0KyBFbmRvdGhlbGlhbCBDZWxscyBJIiA9ICJDRDM0KyBFQyBJIiwgCiAgICAgICAgICAgICAgICJDRDM0KyBFbmRvdGhlbGlhbCBDZWxscyBJSSIgPSAiQ0QzNCsgRUMgSUkiLCAKICAgICAgICAgICAgICAgIk1peGVkIENlbGxzIEkiID0gIk1peGVkIEkiLCAKICAgICAgICAgICAgICAgIk1peGVkIENlbGxzIElJIiA9ICJNaXhlZCBJSSIsIAogICAgICAgICAgICAgICAiQUNUQTIrIFNtb290aCBNdXNjbGUgQ2VsbHMiID0gIkFDVEEyKyBTTUMiLCAKICAgICAgICAgICAgICAgIk5DQU0xKyBOYXR1cmFsIEtpbGxlciBDZWxscyIgPSAiTkNBTTErIE5LIiwgCiAgICAgICAgICAgICAgICJLSVQrIE1hc3QgQ2VsbHMiID0gIktJVCsgTUMiLAogICAgICAgICAgICAgICAiQ0Q3OUErIEIgQ2VsbHMgSSIgPSAiQ0Q3OUErIEIgSSIsIAogICAgICAgICAgICAgICAiQ0Q3OUErIEIgQ2VsbHMgSUkiID0gIkNENzlBKyBCIElJIikKCnNjUk5Bc2VxRGF0YSA8LSBTZXVyYXQ6OlJlbmFtZUlkZW50cyhvYmplY3QgPSBzY1JOQXNlcURhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjZWxsdHlwZXMpCmBgYAoKYGBge3IgQ2hhbmdlIGNlbGwgY3VtbXVuaXR5IG5hbWVzIC0gbmV3IHBsb3R9ClVNQVBQbG90KHNjUk5Bc2VxRGF0YSwgbGFiZWwgPSBUUlVFLCBwdC5zaXplID0gMS4yNSwgbGFiZWwuc2l6ZSA9IDQsIGdyb3VwLmJ5ID0gImlkZW50IiwKICAgICAgICAgcmVwZWwgPSBUUlVFKQoKYGBgCgojIyBDbGluaWNhbCBkYXRhCgpMb2FkaW5nIEF0aGVyby1FeHByZXNzIGNsaW5pY2FsIGRhdGEuCgpgYGB7ciBMb2FkQUVEQn0KcmVxdWlyZShoYXZlbikKCiMgQUVEQiA8LSBoYXZlbjo6cmVhZF9zYXYocGFzdGUwKEFFREJfbG9jLCAiLzIwMTktM05FV19BdGhlcm9FeHByZXNzRGF0YWJhc2VfU2NpZW50aWZpY0FFXzAyMDcyMDE5X0lDX2FkZGVkLnNhdiIpKQojIEFFREIgPC0gaGF2ZW46OnJlYWRfc2F2KHBhc3RlMChBRURCX2xvYywgIi8yMDIwXzFfTkVXX0F0aGVyb0V4cHJlc3NEYXRhYmFzZV9TY2llbnRpZmljQUVfMTYtMDMtMjAyMC5zYXYiKSkKQUVEQiA8LSBoYXZlbjo6cmVhZF9zYXYocGFzdGUwKEFFREJfbG9jLCAiLzIwMjFfMV9ORVdfQXRoZXJvRXhwcmVzc0RhdGFiYXNlX1NjaWVudGlmaWNBRV8wMS0wMi0yMDIxLnNhdiIpKQpBRURCIDwtIGhhdmVuOjpyZWFkX3NhdihwYXN0ZTAoQUVEQl9sb2MsICIvMjAyMV8zX05FV19BdGhlcm9FeHByZXNzRGF0YWJhc2VfU2NpZW50aWZpY0FFXzEwLTA5LTIwMjEuc2F2IikpCgoKYGBgCgojIyMgRml4aW5nIGFuZCBjcmVhdGluZyB2YXJpYWJsZXMKCldlIG5lZWQgdG8gYmUgdmVyeSBzdHJpY3QgaW4gZGVmaW5pbmcgKnN5bXB0b21zLiogVGhlcmVmb3JlIHdlIHdpbGwgZml4IGEgbmV3CnZhcmlhYmxlIHRoYXQgZ3JvdXBzICpzeW1wdG9tcyogYXQgaW5jbHVzaW9uLgoKQ29kaW5nIG9mICpzeW1wdG9tcyogaXMgYXMgZm9sbG93czoKCi0gICBtaXNzaW5nIC05OTlcCi0gICBBc3ltcHRvbWF0aWMgMFwKLSAgIFRJQSAxXAotICAgbWlub3Igc3Ryb2tlIDJcCi0gICBNYWpvciBzdHJva2UgM1wKLSAgIEFtYXVyb3NpcyBmdWdheCA0XAotICAgRm91ciB2ZXNzZWwgZGlzZWFzZSA1XAotICAgVmVydGVicm9iYXNpbGFyeSBUSUEgN1wKLSAgIFJldGluYWwgaW5mYXJjdGlvbiA4XAotICAgU3ltcHRvbWF0aWMsIGJ1dCBhc3BlY2lmaWMgc3ltdG9tcyA5Ci0gICBDb250cmFsYXRlcmFsIHN5bXB0b21hdGljIG9jY2x1c2lvbiAxMFwKLSAgIHJldGluYWwgaW5mYXJjdGlvbiAxMVwKLSAgIGFybWNsYXVkaWNhdGlvbiBkdWUgdG8gb2NjbHVzaW9uIHN1YmNsYXZpYW4gYXJ0ZXJ5LCBDRUEgbmVlZGVkIGZvciBieXBhc3MKICAgIDEyXAotICAgcmV0aW5hbCBpbmZhcmN0aW9uICsgVElBcyAxM1wKLSAgIE9jdWxhciBpc2NoZW1pYyBzeW5kcm9tZSAxNFwKLSAgIGlzY2hlbWlzY2ggZ2xhdWNvb20gMTVcCi0gICBzdWJjbGF2aWFuIHN0ZWFsIHN5bmRyb21lIDE2XAotICAgVEdBIDE3CgpXZSB3aWxsIGdyb3VwIGFzIGZvbGxvd3MgaW4gYFN5bXB0b21zLjVHYDoKCjEuICBBc3ltcHRvbWF0aWMgXD4gMAoyLiAgVElBIFw+IDEsIDcsIDEzCjMuICBTdHJva2UgXD4gMiwgMwo0LiAgT2N1bGFyIFw+IDQsIDE0LCAxNQo1LiAgUmV0aW5hbCBpbmZhcmN0aW9uIFw+IDgsIDExCjYuICBPdGhlciBcPiA1LCA5LCAxMCwgMTIsIDE2LCAxNwoKV2Ugd2lsbCBhbHNvIGdyb3VwIGFzIGZvbGxvd3MgaW4gYEFzeW1wdFN5bXB0YDoKCjEuICBBc3ltcHRvbWF0aWMgXD4gMAoyLiAgVElBIFw+IDEsIDcsIDEzICsgU3Ryb2tlIFw+IDIsIDMKMy4gIE9jdWxhciBcPiA0LCAxNCwgMTUgKyBSZXRpbmFsIGluZmFyY3Rpb24gXD4gOCwgMTEgKyBPdGhlciBcPiA1LCA5LCAxMCwgMTIsCiAgICAxNiwgMTcKCldlIHdpbGwgYWxzbyBncm91cCBhcyBmb2xsb3dzIGluIGBBc3ltcHRTeW1wdDJHYDoKCjEuICBBc3ltcHRvbWF0aWMgXD4gMAoyLiAgVElBIFw+IDEsIDcsIDEzICsgU3Ryb2tlIFw+IDIsIDMgT2N1bGFyIFw+IDQsIDE0LCAxNSArIFJldGluYWwgaW5mYXJjdGlvbiBcPgogICAgOCwgMTEgKyBPdGhlciBcPiA1LCA5LCAxMCwgMTIsIDE2LCAxNwoKYGBge3IgRml4U3ltcHRvbXMsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgRml4IHN5bXB0b21zCgphdHRhY2goQUVEQikKCkFFREIkc3ltcHRbaXMubmEoQUVEQiRzeW1wdCldIDwtIC05OTkKCiMgU3ltcHRvbXMuNUcKQUVEQlssIlN5bXB0b21zLjVHIl0gPC0gTkEKIyBBRURCJFN5bXB0b21zLjVHW3N5bXB0ID09ICJOQSJdIDwtICJBc3ltcHRvbWF0aWMiCkFFREIkU3ltcHRvbXMuNUdbc3ltcHQgPT0gLTk5OV0gPC0gTkEKQUVEQiRTeW1wdG9tcy41R1tzeW1wdCA9PSAwXSA8LSAiQXN5bXB0b21hdGljIgpBRURCJFN5bXB0b21zLjVHW3N5bXB0ID09IDEgfCBzeW1wdCA9PSA3IHwgc3ltcHQgPT0gMTNdIDwtICJUSUEiCkFFREIkU3ltcHRvbXMuNUdbc3ltcHQgPT0gMiB8IHN5bXB0ID09IDNdIDwtICJTdHJva2UiCkFFREIkU3ltcHRvbXMuNUdbc3ltcHQgPT0gNCB8IHN5bXB0ID09IDE0IHwgc3ltcHQgPT0gMTUgXSA8LSAiT2N1bGFyIgpBRURCJFN5bXB0b21zLjVHW3N5bXB0ID09IDggfCBzeW1wdCA9PSAxMV0gPC0gIlJldGluYWwgaW5mYXJjdGlvbiIKQUVEQiRTeW1wdG9tcy41R1tzeW1wdCA9PSA1IHwgc3ltcHQgPT0gOSB8IHN5bXB0ID09IDEwIHwgc3ltcHQgPT0gMTIgfCBzeW1wdCA9PSAxNiB8IHN5bXB0ID09IDE3XSA8LSAiT3RoZXIiCgojIEFzeW1wdFN5bXB0CkFFREJbLCJBc3ltcHRTeW1wdCJdIDwtIE5BCkFFREIkQXN5bXB0U3ltcHRbc3ltcHQgPT0gLTk5OV0gPC0gTkEKQUVEQiRBc3ltcHRTeW1wdFtzeW1wdCA9PSAwXSA8LSAiQXN5bXB0b21hdGljIgpBRURCJEFzeW1wdFN5bXB0W3N5bXB0ID09IDEgfCBzeW1wdCA9PSA3IHwgc3ltcHQgPT0gMTMgfCBzeW1wdCA9PSAyIHwgc3ltcHQgPT0gM10gPC0gIlN5bXB0b21hdGljIgpBRURCJEFzeW1wdFN5bXB0W3N5bXB0ID09IDQgfCBzeW1wdCA9PSAxNCB8IHN5bXB0ID09IDE1IHwgc3ltcHQgPT0gOCB8IHN5bXB0ID09IDExIHwgc3ltcHQgPT0gNSB8IHN5bXB0ID09IDkgfCBzeW1wdCA9PSAxMCB8IHN5bXB0ID09IDEyIHwgc3ltcHQgPT0gMTYgfCBzeW1wdCA9PSAxN10gPC0gIk9jdWxhciBhbmQgb3RoZXJzIgoKIyBBc3ltcHRTeW1wdApBRURCWywiQXN5bXB0U3ltcHQyRyJdIDwtIE5BCkFFREIkQXN5bXB0U3ltcHQyR1tzeW1wdCA9PSAtOTk5XSA8LSBOQQpBRURCJEFzeW1wdFN5bXB0Mkdbc3ltcHQgPT0gMF0gPC0gIkFzeW1wdG9tYXRpYyIKQUVEQiRBc3ltcHRTeW1wdDJHW3N5bXB0ID09IDEgfCBzeW1wdCA9PSA3IHwgc3ltcHQgPT0gMTMgfCBzeW1wdCA9PSAyIHwgc3ltcHQgPT0gMyB8IHN5bXB0ID09IDQgfCBzeW1wdCA9PSAxNCB8IHN5bXB0ID09IDE1IHwgc3ltcHQgPT0gOCB8IHN5bXB0ID09IDExIHwgc3ltcHQgPT0gNSB8IHN5bXB0ID09IDkgfCBzeW1wdCA9PSAxMCB8IHN5bXB0ID09IDEyIHwgc3ltcHQgPT0gMTYgfCBzeW1wdCA9PSAxN10gPC0gIlN5bXB0b21hdGljIgoKZGV0YWNoKEFFREIpCgojIHRhYmxlKEFFREIkc3ltcHQsIHVzZU5BID0gImlmYW55IikKIyB0YWJsZShBRURCJEFzeW1wdFN5bXB0MkcsIHVzZU5BID0gImlmYW55IikKIyB0YWJsZShBRURCJFN5bXB0b21zLjVHLCB1c2VOQSA9ICJpZmFueSIpCiMgCiMgdGFibGUoQUVEQiRBc3ltcHRTeW1wdDJHLCBBRURCJHN5bXB0LCB1c2VOQSA9ICJpZmFueSIpCiMgdGFibGUoQUVEQiRTeW1wdG9tcy41RywgQUVEQiRzeW1wdCwgdXNlTkEgPSAiaWZhbnkiKQp0YWJsZShBRURCJEFzeW1wdFN5bXB0MkcsIEFFREIkU3ltcHRvbXMuNUcsIHVzZU5BID0gImlmYW55IikKCiMgQUVEQi50ZW1wIDwtIHN1YnNldChBRURCLCAgc2VsZWN0ID0gYygiU1RVRFlfTlVNQkVSIiwgIlVQSUQiLCAiQWdlIiwgIkdlbmRlciIsICJIb3NwaXRhbCIsICJBcnRlcnlfc3VtbWFyeSIsICJzeW1wdCIsICJTeW1wdG9tcy41RyIsICJBc3ltcHRTeW1wdCIpKQojIHJlcXVpcmUobGFiZWxsZWQpCiMgQUVEQi50ZW1wJEdlbmRlciA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEdlbmRlcikKIyBBRURCLnRlbXAkSG9zcGl0YWwgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRIb3NwaXRhbCkKIyBBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSkKIyAKIyBEVDo6ZGF0YXRhYmxlKEFFREIudGVtcFsxOjEwLF0sIGNhcHRpb24gPSAiRXhjZXJwdCBvZiB0aGUgd2hvbGUgQUVEQi4iLCByb3duYW1lcyA9IEZBTFNFKQojIAojIHRhYmxlKEFFREIudGVtcCRTeW1wdG9tcy41RywgQUVEQi50ZW1wJEFzeW1wdFN5bXB0KQojIAojIHJtKEFFREIudGVtcCkKCmBgYAoKV2Ugd2lsbCBhbHNvIGZpeCB0aGUgKnBsYXF1ZXBoZW5vdHlwZXMqIHZhcmlhYmxlLgoKQ29kaW5nIG9mIHN5bXB0b21zIGlzIGFzIGZvbGxvd3M6CgotICAgbWlzc2luZyAtOTk5XAotICAgbm90IHJlbGV2YW50IC04ODgKLSAgIGZpYnJvdXMgMVwKLSAgIGZpYnJvYXRoZXJvbWF0b3VzIDJcCi0gICBhdGhlcm9tYXRvdXMgMwoKYGBge3IgRml4UGxhcXVlUGhlbm90eXBlcywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KCiMgRml4IHBsYXF1ZXBoZW5vdHlwZXMKYXR0YWNoKEFFREIpCkFFREJbLCJPdmVyYWxsUGxhcXVlUGhlbm90eXBlIl0gPC0gTkEKQUVEQiRPdmVyYWxsUGxhcXVlUGhlbm90eXBlW3BsYXF1ZXBoZW5vdHlwZSA9PSAtOTk5XSA8LSBOQQpBRURCJE92ZXJhbGxQbGFxdWVQaGVub3R5cGVbcGxhcXVlcGhlbm90eXBlID09IC05OTldIDwtIE5BCkFFREIkT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZVtwbGFxdWVwaGVub3R5cGUgPT0gMV0gPC0gImZpYnJvdXMiCkFFREIkT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZVtwbGFxdWVwaGVub3R5cGUgPT0gMl0gPC0gImZpYnJvYXRoZXJvbWF0b3VzIgpBRURCJE92ZXJhbGxQbGFxdWVQaGVub3R5cGVbcGxhcXVlcGhlbm90eXBlID09IDNdIDwtICJhdGhlcm9tYXRvdXMiCmRldGFjaChBRURCKQoKdGFibGUoQUVEQiRPdmVyYWxsUGxhcXVlUGhlbm90eXBlKQoKIyBBRURCLnRlbXAgPC0gc3Vic2V0KEFFREIsICBzZWxlY3QgPSBjKCJTVFVEWV9OVU1CRVIiLCAiVVBJRCIsICJBZ2UiLCAiR2VuZGVyIiwgIkhvc3BpdGFsIiwgIkFydGVyeV9zdW1tYXJ5IiwgInBsYXF1ZXBoZW5vdHlwZSIsICJPdmVyYWxsUGxhcXVlUGhlbm90eXBlIikpCiMgcmVxdWlyZShsYWJlbGxlZCkKIyBBRURCLnRlbXAkR2VuZGVyIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkR2VuZGVyKQojIEFFREIudGVtcCRIb3NwaXRhbCA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEhvc3BpdGFsKQojIEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5KQojIAojIERUOjpkYXRhdGFibGUoQUVEQi50ZW1wWzE6MTAsXSwgY2FwdGlvbiA9ICJFeGNlcnB0IG9mIHRoZSB3aG9sZSBBRURCLiIsIHJvd25hbWVzID0gRkFMU0UpCiMgCiMgcm0oQUVEQi50ZW1wKQoKYGBgCgpXZSB3aWxsIGFsc28gZml4IHRoZSAqZGlhYmV0ZXMqIHN0YXR1cyB2YXJpYWJsZS4gV2UgZGVmaW5lIGRpYWJldGVzIGFzIGhpc3RvcnkKb2YgYSBkaWFnbm9zaXMgYW5kL29yIHVzZSBvZiBnbHVjb3NlLWxvd2VyaW5nIG1lZGljYXRpb25zLgoKYGBge3IgRml4RGlhYmV0ZXMsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CiMgRml4IGRpYWJldGVzCmF0dGFjaChBRURCKQpBRURCWywiRGlhYmV0ZXNTdGF0dXMiXSA8LSBOQQpBRURCJERpYWJldGVzU3RhdHVzW0RNLmNvbXBvc2l0ZSA9PSAtOTk5XSA8LSBOQQpBRURCJERpYWJldGVzU3RhdHVzW0RNLmNvbXBvc2l0ZSA9PSAwXSA8LSAiQ29udHJvbCAobm8gRGlhYmV0ZXMgRHgvTWVkKSIKQUVEQiREaWFiZXRlc1N0YXR1c1tETS5jb21wb3NpdGUgPT0gMV0gPC0gIkRpYWJldGVzIgpkZXRhY2goQUVEQikKCnRhYmxlKEFFREIkRE0uY29tcG9zaXRlKQoKdGFibGUoQUVEQiREaWFiZXRlc1N0YXR1cykKCgojIEFFREIudGVtcCA8LSBzdWJzZXQoQUVEQiwgIHNlbGVjdCA9IGMoIlNUVURZX05VTUJFUiIsICJVUElEIiwgIkFnZSIsICJHZW5kZXIiLCAiSG9zcGl0YWwiLCAiQXJ0ZXJ5X3N1bW1hcnkiLCAiRE0uY29tcG9zaXRlIiwgIkRpYWJldGVzU3RhdHVzIikpCiMgcmVxdWlyZShsYWJlbGxlZCkKIyBBRURCLnRlbXAkR2VuZGVyIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkR2VuZGVyKQojIEFFREIudGVtcCRIb3NwaXRhbCA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEhvc3BpdGFsKQojIEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5KQojIEFFREIudGVtcCREaWFiZXRlc1N0YXR1cyA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJERpYWJldGVzU3RhdHVzKQojIAojIERUOjpkYXRhdGFibGUoQUVEQi50ZW1wWzE6MTAsXSwgY2FwdGlvbiA9ICJFeGNlcnB0IG9mIHRoZSB3aG9sZSBBRURCLiIsIHJvd25hbWVzID0gRkFMU0UpCiMgCiMgcm0oQUVEQi50ZW1wKQoKYGBgCgpXZSB3aWxsIGFsc28gZml4IHRoZSAqc21va2luZyogc3RhdHVzIHZhcmlhYmxlLiBXZSBhcmUgaW50ZXJlc3RlZCBpbiB3aGV0aGVyCnNvbWVvbmUgbmV2ZXIsIGV2ZXIgb3IgaXMgY3VycmVudGx5IChhdCB0aGUgdGltZSBvZiBpbmNsdXNpb24pIHNtb2tpbmcuIFRoaXMgaXMKYmFzZWQgb24gdGhlIHF1ZXN0aW9ubmFpcmUuCgotICAgYGRpZXQ4MDFgOiBhcmUgeW91IGEgc21va2VyPwotICAgYGRpZXQ4MDJgOiBkaWQgeW91IHNtb2tlIGluIHRoZSBwYXN0PwoKV2UgYWxyZWFkeSBoYXZlIHNvbWUgdmFyaWFibGVzIGluZGljYXRpbmcgc21va2luZyBzdGF0dXM6CgotICAgYFNtb2tpbmdSZXBvcnRlZGA6IHBhdGllbnQgaGFzIHJlcG9ydGVkIHRvIHNtb2tlLgotICAgYFNtb2tpbmdZZWFyT1JgOiBzbW9raW5nIGluIHRoZSB5ZWFyIG9mIHN1cmdlcnk/Ci0gICBgU21va2VyQ3VycmVudGA6IGN1cnJlbnRseSBzbW9raW5nPwoKYGBge3IgRml4U21va2luZywgbWVzc2FnZT1GQUxTRSwgd2FybmluZz1GQUxTRX0KcmVxdWlyZShsYWJlbGxlZCkKQUVEQiRkaWV0ODAxIDwtIHRvX2ZhY3RvcihBRURCJGRpZXQ4MDEpCkFFREIkZGlldDgwMiA8LSB0b19mYWN0b3IoQUVEQiRkaWV0ODAyKQpBRURCJGRpZXQ4MDUgPC0gdG9fZmFjdG9yKEFFREIkZGlldDgwNSkKQUVEQiRTbW9raW5nUmVwb3J0ZWQgPC0gdG9fZmFjdG9yKEFFREIkU21va2luZ1JlcG9ydGVkKQpBRURCJFNtb2tlckN1cnJlbnQgPC0gdG9fZmFjdG9yKEFFREIkU21va2VyQ3VycmVudCkKQUVEQiRTbW9raW5nWWVhck9SIDwtIHRvX2ZhY3RvcihBRURCJFNtb2tpbmdZZWFyT1IpCgojIHRhYmxlKEFFREIkZGlldDgwMSkKIyB0YWJsZShBRURCJGRpZXQ4MDIpCiMgdGFibGUoQUVEQiRTbW9raW5nUmVwb3J0ZWQpCiMgdGFibGUoQUVEQiRTbW9rZXJDdXJyZW50KQojIHRhYmxlKEFFREIkU21va2luZ1llYXJPUikKIyB0YWJsZShBRURCJFNtb2tpbmdSZXBvcnRlZCwgQUVEQiRTbW9rZXJDdXJyZW50LCB1c2VOQSA9ICJpZmFueSIsIGRubiA9IGMoIlJlcG9ydGVkIHNtb2tpbmciLCAiQ3VycmVudCBzbW9rZXIiKSkKIyAKIyB0YWJsZShBRURCJGRpZXQ4MDEsIEFFREIkZGlldDgwMiwgdXNlTkEgPSAiaWZhbnkiLCBkbm4gPSBjKCJTbW9rZXIiLCAiUGFzdCBzbW9rZXIiKSkKCmNhdCgiXG5GaXhpbmcgc21va2luZyBzdGF0dXMuXG4iKQphdHRhY2goQUVEQikKQUVEQlssIlNtb2tlclN0YXR1cyJdIDwtIE5BCkFFREIkU21va2VyU3RhdHVzW2RpZXQ4MDIgPT0gImRvbid0IGtub3ciXSA8LSAiTmV2ZXIgc21va2VkIgpBRURCJFNtb2tlclN0YXR1c1tkaWV0ODAyID09ICJJIHN0aWxsIHNtb2tlIl0gPC0gIkN1cnJlbnQgc21va2VyIgpBRURCJFNtb2tlclN0YXR1c1tTbW9rZXJDdXJyZW50ID09ICJubyIgJiBkaWV0ODAyID09ICJubyJdIDwtICJOZXZlciBzbW9rZWQiCkFFREIkU21va2VyU3RhdHVzW1Ntb2tlckN1cnJlbnQgPT0gIm5vIiAmIGRpZXQ4MDIgPT0gInllcyJdIDwtICJFeC1zbW9rZXIiCkFFREIkU21va2VyU3RhdHVzW1Ntb2tlckN1cnJlbnQgPT0gInllcyJdIDwtICJDdXJyZW50IHNtb2tlciIKQUVEQiRTbW9rZXJTdGF0dXNbU21va2VyQ3VycmVudCA9PSAibm8gZGF0YSBhdmFpbGFibGUvbWlzc2luZyJdIDwtIE5BCiMgQUVEQiRTbW9rZXJTdGF0dXNbaXMubmEoU21va2VyQ3VycmVudCldIDwtICJOZXZlciBzbW9rZWQiCmRldGFjaChBRURCKQoKY2F0KCJcbiogQ3VycmVudCBzbW9raW5nIHN0YXR1cy5cbiIpCnRhYmxlKEFFREIkU21va2VyQ3VycmVudCwKICAgICAgdXNlTkEgPSAiaWZhbnkiLCAKICAgICAgZG5uID0gYygiQ3VycmVudCBzbW9rZXIiKSkKCmNhdCgiXG4qIFVwZGF0ZWQgc21va2luZyBzdGF0dXMuXG4iKQp0YWJsZShBRURCJFNtb2tlclN0YXR1cywKICAgICAgdXNlTkEgPSAiaWZhbnkiLCAKICAgICAgZG5uID0gYygiVXBkYXRlZCBzbW9raW5nIHN0YXR1cyIpKQoKY2F0KCJcbiogQ29tcGFyaW5nIHRvICdTbW9rZXJDdXJyZW50Jy5cbiIpCnRhYmxlKEFFREIkU21va2VyU3RhdHVzLCBBRURCJFNtb2tlckN1cnJlbnQsIAogICAgICB1c2VOQSA9ICJpZmFueSIsIAogICAgICBkbm4gPSBjKCJVcGRhdGVkIHNtb2tpbmcgc3RhdHVzIiwgIkN1cnJlbnQgc21va2VyIikpCgojIEFFREIudGVtcCA8LSBzdWJzZXQoQUVEQiwgIHNlbGVjdCA9IGMoIlNUVURZX05VTUJFUiIsICJVUElEIiwgIkFnZSIsICJHZW5kZXIiLCAiSG9zcGl0YWwiLCAiQXJ0ZXJ5X3N1bW1hcnkiLCAiRE0uY29tcG9zaXRlIiwgIkRpYWJldGVzU3RhdHVzIikpCiMgcmVxdWlyZShsYWJlbGxlZCkKIyBBRURCLnRlbXAkR2VuZGVyIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkR2VuZGVyKQojIEFFREIudGVtcCRIb3NwaXRhbCA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEhvc3BpdGFsKQojIEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5KQojIEFFREIudGVtcCREaWFiZXRlc1N0YXR1cyA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJERpYWJldGVzU3RhdHVzKQojIAojIERUOjpkYXRhdGFibGUoQUVEQi50ZW1wWzE6MTAsXSwgY2FwdGlvbiA9ICJFeGNlcnB0IG9mIHRoZSB3aG9sZSBBRURCLiIsIHJvd25hbWVzID0gRkFMU0UpCiMgCiMgcm0oQUVEQi50ZW1wKQoKCmBgYAoKV2Ugd2lsbCBhbHNvIGZpeCB0aGUgKmFsY29ob2wqIHN0YXR1cyB2YXJpYWJsZS4KCmBgYHtyIEZpeEFsY29ob2wsIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgojIEZpeCBkaWFiZXRlcwphdHRhY2goQUVEQikKQUVEQlssIkFsY29ob2xVc2UiXSA8LSBOQQpBRURCJEFsY29ob2xVc2VbZGlldDgxMCA9PSAtOTk5XSA8LSBOQQpBRURCJEFsY29ob2xVc2VbZGlldDgxMCA9PSAwXSA8LSAiTm8iCkFFREIkQWxjb2hvbFVzZVtkaWV0ODEwID09IDFdIDwtICJZZXMiCmRldGFjaChBRURCKQoKdGFibGUoQUVEQiRBbGNvaG9sVXNlKQoKIyBBRURCLnRlbXAgPC0gc3Vic2V0KEFFREIsICBzZWxlY3QgPSBjKCJTVFVEWV9OVU1CRVIiLCAiVVBJRCIsICJBZ2UiLCAiR2VuZGVyIiwgIkhvc3BpdGFsIiwgIkFydGVyeV9zdW1tYXJ5IiwgImRpZXQ4MTAiLCAiQWxjb2hvbFVzZSIpKQojIHJlcXVpcmUobGFiZWxsZWQpCiMgQUVEQi50ZW1wJEdlbmRlciA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEdlbmRlcikKIyBBRURCLnRlbXAkSG9zcGl0YWwgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRIb3NwaXRhbCkKIyBBRURCLnRlbXAkQXJ0ZXJ5X3N1bW1hcnkgPC0gdG9fZmFjdG9yKEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSkKIyBBRURCLnRlbXAkQWxjb2hvbFVzZSA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEFsY29ob2xVc2UpCiMgCiMgRFQ6OmRhdGF0YWJsZShBRURCLnRlbXBbMToxMCxdLCBjYXB0aW9uID0gIkV4Y2VycHQgb2YgdGhlIHdob2xlIEFFREIuIiwgcm93bmFtZXMgPSBGQUxTRSkKIyAKIyBybShBRURCLnRlbXApCgoKYGBgCgpXZSB3aWxsIGFsc28gZml4IGEgaGlzdG9yeSBvZiBDQUQsIHN0cm9rZSBvciBwZXJpcGhlcmFsIGludGVydmVudGlvbiBzdGF0dXMKdmFyaWFibGUuIFRoaXMgd2lsbCBiZSBiYXNlZCBvbiBgQ0FEX2hpc3RvcnlgLCBgU3Ryb2tlX2hpc3RvcnlgLCBhbmQKYFBlcmlwaGVyYWwuaW50ZXJ2YAoKYGBge3IgRml4Q0FEX0hpc3RvcnksIG1lc3NhZ2U9RkFMU0UsIHdhcm5pbmc9RkFMU0V9CgojIEZpeCBkaWFiZXRlcwphdHRhY2goQUVEQikKQUVEQlssIk1lZEh4X0NWRCJdIDwtIE5BCkFFREIkTWVkSHhfQ1ZEW0NBRF9oaXN0b3J5ID09IDAgfCBTdHJva2VfaGlzdG9yeSA9PSAwIHwgUGVyaXBoZXJhbC5pbnRlcnYgPT0gMF0gPC0gIk5vIgpBRURCJE1lZEh4X0NWRFtDQURfaGlzdG9yeSA9PSAxIHwgU3Ryb2tlX2hpc3RvcnkgPT0gMSB8IFBlcmlwaGVyYWwuaW50ZXJ2ID09IDFdIDwtICJ5ZXMiCmRldGFjaChBRURCKQoKdGFibGUoQUVEQiRDQURfaGlzdG9yeSkKdGFibGUoQUVEQiRTdHJva2VfaGlzdG9yeSkKdGFibGUoQUVEQiRQZXJpcGhlcmFsLmludGVydikKdGFibGUoQUVEQiRNZWRIeF9DVkQpCgojIEFFREIudGVtcCA8LSBzdWJzZXQoQUVEQiwgIHNlbGVjdCA9IGMoIlNUVURZX05VTUJFUiIsICJVUElEIiwgIkFnZSIsICJHZW5kZXIiLCAiSG9zcGl0YWwiLCAiQXJ0ZXJ5X3N1bW1hcnkiLCAiZGlldDgxMCIsICJBbGNvaG9sVXNlIikpCiMgcmVxdWlyZShsYWJlbGxlZCkKIyBBRURCLnRlbXAkR2VuZGVyIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkR2VuZGVyKQojIEFFREIudGVtcCRIb3NwaXRhbCA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEhvc3BpdGFsKQojIEFFREIudGVtcCRBcnRlcnlfc3VtbWFyeSA8LSB0b19mYWN0b3IoQUVEQi50ZW1wJEFydGVyeV9zdW1tYXJ5KQojIEFFREIudGVtcCRBbGNvaG9sVXNlIDwtIHRvX2ZhY3RvcihBRURCLnRlbXAkQWxjb2hvbFVzZSkKIyAKIyBEVDo6ZGF0YXRhYmxlKEFFREIudGVtcFsxOjEwLF0sIGNhcHRpb24gPSAiRXhjZXJwdCBvZiB0aGUgd2hvbGUgQUVEQi4iLCByb3duYW1lcyA9IEZBTFNFKQojIAojIHJtKEFFREIudGVtcCkKCgpgYGAKCldlIHdpbGwgYWxzbyBmaXggYW5kIGludmVyc2UtcmFuayBub3JtYWwgdHJhbnNmb3JtIHRoZSBjb250aW51b3VzIChtYW51YWxseSkKc2NvcmVkIHBsYXF1ZSBwaGVub3R5cGVzLgoKYGBge3IgSVJOVCBQbGFxdWVQaGVub3R5cGVzfQpBRURCJG1hY21lYW4wIDwtIGFzLm51bWVyaWMoQUVEQiRtYWNtZWFuMCkKQUVEQiRzbWNtZWFuMCA8LSBhcy5udW1lcmljKEFFREIkc21jbWVhbjApCkFFREIkbmV1dHJvcGhpbHMgPC0gYXMubnVtZXJpYyhBRURCJG5ldXRyb3BoaWxzKQpBRURCJE1hc3RfY2VsbHNfcGxhcXVlIDwtIGFzLm51bWVyaWMoQUVEQiRNYXN0X2NlbGxzX3BsYXF1ZSkKQUVEQiR2ZXNzZWxfZGVuc2l0eV9hdmVyYWdlZCA8LSBhcy5udW1lcmljKEFFREIkdmVzc2VsX2RlbnNpdHlfYXZlcmFnZWQpCgpBRURCJE1BQ19yYW5rTm9ybSA8LSBxbm9ybSgocmFuayhBRURCJG1hY21lYW4wLCBuYS5sYXN0ID0gImtlZXAiKSAtIDAuNSkgLyBzdW0oIWlzLm5hKEFFREIkbWFjbWVhbjApKSkKQUVEQiRTTUNfcmFua05vcm0gPC0gcW5vcm0oKHJhbmsoQUVEQiRzbWNtZWFuMCwgbmEubGFzdCA9ICJrZWVwIikgLSAwLjUpIC8gc3VtKCFpcy5uYShBRURCJHNtY21lYW4wKSkpCkFFREIkTmV1dHJvcGhpbHNfcmFua05vcm0gPC0gcW5vcm0oKHJhbmsoQUVEQiRuZXV0cm9waGlscywgbmEubGFzdCA9ICJrZWVwIikgLSAwLjUpIC8gc3VtKCFpcy5uYShBRURCJG5ldXRyb3BoaWxzKSkpCkFFREIkTWFzdENlbGxzX3JhbmtOb3JtIDwtIHFub3JtKChyYW5rKEFFREIkTWFzdF9jZWxsc19wbGFxdWUsIG5hLmxhc3QgPSAia2VlcCIpIC0gMC41KSAvIHN1bSghaXMubmEoQUVEQiRNYXN0X2NlbGxzX3BsYXF1ZSkpKQpBRURCJFZlc3NlbERlbnNpdHlfcmFua05vcm0gPC0gcW5vcm0oKHJhbmsoQUVEQiR2ZXNzZWxfZGVuc2l0eV9hdmVyYWdlZCwgbmEubGFzdCA9ICJrZWVwIikgLSAwLjUpIC8gc3VtKCFpcy5uYShBRURCJHZlc3NlbF9kZW5zaXR5X2F2ZXJhZ2VkKSkpCgpgYGAKCmBgYHtyIElSTlQgUGxhcXVlUGhlbm90eXBlczogVmlzdWFsaXNhdGlvbn0KbGlicmFyeShsYWJlbGxlZCkKQUVEQiRHZW5kZXIgPC0gdG9fZmFjdG9yKEFFREIkR2VuZGVyKQpnZ3B1YnI6OmdnaGlzdG9ncmFtKEFFREIsICJtYWNtZWFuMCIsIAogICAgICAgICAgICAgICAgICAgICMgeSA9ICIuLmNvdW50Li4iLCAKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwgCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lZGlhbiIsIAogICAgICAgICAgICAgICAgICAgICNhZGRfZGVuc2l0eSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiJSBvZiBtYWNyb3BoYWdlcyAoQ0Q2OCkiLAogICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiJSBwZXIgcmVnaW9uIG9mIGludGVyZXN0IiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKCmdncHVicjo6Z2doaXN0b2dyYW0oQUVEQiwgIk1BQ19yYW5rTm9ybSIsIAogICAgICAgICAgICAgICAgICAgICMgeSA9ICIuLmNvdW50Li4iLCAKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwgCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lZGlhbiIsIAogICAgICAgICAgICAgICAgICAgICNhZGRfZGVuc2l0eSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiJSBvZiBtYWNyb3BoYWdlcyAoQ0Q2OCkiLAogICAgICAgICAgICAgICAgICAgeGxhYiA9ICIlIHBlciByZWdpb24gb2YgaW50ZXJlc3RcbmludmVyc2UtcmFuayBub3JtYWxpemVkIG51bWJlciIsIAogICAgICAgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpCgpnZ3B1YnI6OmdnaGlzdG9ncmFtKEFFREIsICJzbWNtZWFuMCIsIAogICAgICAgICAgICAgICAgICAgICMgeSA9ICIuLmNvdW50Li4iLCAKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwgCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lZGlhbiIsIAogICAgICAgICAgICAgICAgICAgICNhZGRfZGVuc2l0eSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAiJSBvZiBzbW9vdGggbXVzY2xlIGNlbGxzIChTTUEpIiwKICAgICAgICAgICAgICAgICAgICB4bGFiID0gIiUgcGVyIHJlZ2lvbiBvZiBpbnRlcmVzdCIsIAogICAgICAgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpCgpnZ3B1YnI6OmdnaGlzdG9ncmFtKEFFREIsICJTTUNfcmFua05vcm0iLCAKICAgICAgICAgICAgICAgICAgICAjIHkgPSAiLi5jb3VudC4uIiwgCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiIzEyOTBEOSIsICIjREIwMDNGIiksIAogICAgICAgICAgICAgICAgICAgIGFkZCA9ICJtZWRpYW4iLCAKICAgICAgICAgICAgICAgICAgICAjYWRkX2RlbnNpdHkgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgIHJ1ZyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgI2FkZC5wYXJhbXMgPSAgbGlzdChjb2xvciA9ICJibGFjayIsIGxpbmV0eXBlID0gMiksIAogICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIiUgb2Ygc21vb3RoIG11c2NsZSBjZWxscyAoU01BKSIsCiAgICAgICAgICAgICAgICAgICB4bGFiID0gIiUgcGVyIHJlZ2lvbiBvZiBpbnRlcmVzdFxuaW52ZXJzZS1yYW5rIG5vcm1hbGl6ZWQgbnVtYmVyIiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKCmdncHVicjo6Z2doaXN0b2dyYW0oQUVEQiwgIm5ldXRyb3BoaWxzIiwgCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsIAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICBmaWxsID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiMxMjkwRDkiLCAiI0RCMDAzRiIpLCAKICAgICAgICAgICAgICAgICAgICBhZGQgPSAibWVkaWFuIiwgCiAgICAgICAgICAgICAgICAgICAgI2FkZF9kZW5zaXR5ID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICBydWcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICNhZGQucGFyYW1zID0gIGxpc3QoY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9IDIpLCAKICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJudW1iZXIgb2YgbmV1dHJvcGhpbHMgKENENjZiKSIsCiAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJjb3VudHMgcGVyIHBsYXF1ZSIsIAogICAgICAgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpCgpnZ3B1YnI6OmdnaGlzdG9ncmFtKEFFREIsICJOZXV0cm9waGlsc19yYW5rTm9ybSIsIAogICAgICAgICAgICAgICAgICAgICMgeSA9ICIuLmNvdW50Li4iLCAKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwgCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lZGlhbiIsIAogICAgICAgICAgICAgICAgICAgICNhZGRfZGVuc2l0eSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAibnVtYmVyIG9mIG5ldXRyb3BoaWxzIChDRDY2YikiLAogICAgICAgICAgICAgICAgICAgeGxhYiA9ICJjb3VudHMgcGVyIHBsYXF1ZVxuaW52ZXJzZS1yYW5rIG5vcm1hbGl6ZWQgbnVtYmVyIiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKCmdncHVicjo6Z2doaXN0b2dyYW0oQUVEQiwgIk1hc3RfY2VsbHNfcGxhcXVlIiwgCiAgICAgICAgICAgICAgICAgICAgIyB5ID0gIi4uY291bnQuLiIsIAogICAgICAgICAgICAgICAgICAgIGNvbG9yID0gIndoaXRlIiwKICAgICAgICAgICAgICAgICAgICBmaWxsID0gIkdlbmRlciIsCiAgICAgICAgICAgICAgICAgICAgcGFsZXR0ZSA9IGMoIiMxMjkwRDkiLCAiI0RCMDAzRiIpLCAKICAgICAgICAgICAgICAgICAgICBhZGQgPSAibWVkaWFuIiwgCiAgICAgICAgICAgICAgICAgICAgI2FkZF9kZW5zaXR5ID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICBydWcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICNhZGQucGFyYW1zID0gIGxpc3QoY29sb3IgPSAiYmxhY2siLCBsaW5ldHlwZSA9IDIpLCAKICAgICAgICAgICAgICAgICAgICB0aXRsZSA9ICJudW1iZXIgb2YgbWFzdCBjZWxscyIsCiAgICAgICAgICAgICAgICAgICAgeGxhYiA9ICJjb3VudHMgcGVyIHBsYXF1ZSIsIAogICAgICAgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpCgpnZ3B1YnI6OmdnaGlzdG9ncmFtKEFFREIsICJNYXN0Q2VsbHNfcmFua05vcm0iLCAKICAgICAgICAgICAgICAgICAgICAjIHkgPSAiLi5jb3VudC4uIiwgCiAgICAgICAgICAgICAgICAgICAgY29sb3IgPSAid2hpdGUiLAogICAgICAgICAgICAgICAgICAgIGZpbGwgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICBwYWxldHRlID0gYygiIzEyOTBEOSIsICIjREIwMDNGIiksIAogICAgICAgICAgICAgICAgICAgIGFkZCA9ICJtZWRpYW4iLCAKICAgICAgICAgICAgICAgICAgICAjYWRkX2RlbnNpdHkgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgIHJ1ZyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgI2FkZC5wYXJhbXMgPSAgbGlzdChjb2xvciA9ICJibGFjayIsIGxpbmV0eXBlID0gMiksIAogICAgICAgICAgICAgICAgICAgIHRpdGxlID0gIm51bWJlciBvZiBtYXN0IGNlbGxzIiwKICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiY291bnRzIHBlciBwbGFxdWVcbmludmVyc2UtcmFuayBub3JtYWxpemVkIG51bWJlciIsIAogICAgICAgICAgICAgICAgICAgIGdndGhlbWUgPSB0aGVtZV9taW5pbWFsKCkpCgpnZ3B1YnI6OmdnaGlzdG9ncmFtKEFFREIsICJ2ZXNzZWxfZGVuc2l0eV9hdmVyYWdlZCIsIAogICAgICAgICAgICAgICAgICAgICMgeSA9ICIuLmNvdW50Li4iLCAKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwgCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lZGlhbiIsIAogICAgICAgICAgICAgICAgICAgICNhZGRfZGVuc2l0eSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAibnVtYmVyIG9mIGludHJhcGxhcXVlIG5lb3Zlc3NlbHMiLAogICAgICAgICAgICAgICAgICAgIHhsYWIgPSAiY291bnRzIHBlciAzLTQgaG90c3BvdHMiLCAKICAgICAgICAgICAgICAgICAgICBnZ3RoZW1lID0gdGhlbWVfbWluaW1hbCgpKQoKZ2dwdWJyOjpnZ2hpc3RvZ3JhbShBRURCLCAiVmVzc2VsRGVuc2l0eV9yYW5rTm9ybSIsIAogICAgICAgICAgICAgICAgICAgICMgeSA9ICIuLmNvdW50Li4iLCAKICAgICAgICAgICAgICAgICAgICBjb2xvciA9ICJ3aGl0ZSIsCiAgICAgICAgICAgICAgICAgICAgZmlsbCA9ICJHZW5kZXIiLAogICAgICAgICAgICAgICAgICAgIHBhbGV0dGUgPSBjKCIjMTI5MEQ5IiwgIiNEQjAwM0YiKSwgCiAgICAgICAgICAgICAgICAgICAgYWRkID0gIm1lZGlhbiIsIAogICAgICAgICAgICAgICAgICAgICNhZGRfZGVuc2l0eSA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgcnVnID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAjYWRkLnBhcmFtcyA9ICBsaXN0KGNvbG9yID0gImJsYWNrIiwgbGluZXR5cGUgPSAyKSwgCiAgICAgICAgICAgICAgICAgICAgdGl0bGUgPSAibnVtYmVyIG9mIGludHJhcGxhcXVlIG5lb3Zlc3NlbHMiLAogICAgICAgICAgICAgICAgICAgeGxhYiA9ICJjb3VudHMgcGVyIDMtNCBob3RzcG90c1xuaW52ZXJzZS1yYW5rIG5vcm1hbGl6ZWQgbnVtYmVyIiwgCiAgICAgICAgICAgICAgICAgICAgZ2d0aGVtZSA9IHRoZW1lX21pbmltYWwoKSkKYGBgCgpIZXJlIHdlIGNhbGN1bGF0ZSB0aGUgKnBsYXF1ZSBpbnN0YWJpbGl0eS92dWxuZXJhYmlsaXR5KiBpbmRleAoKYGBge3IgUGxhcXVlIFZ1bG5lcmFiaWxpdHl9CiMgUGxhcXVlIHZ1bG5lcmFiaWxpdHkKcmVxdWlyZShsYWJlbGxlZCkKQUVEQiRNYWNyb3BoYWdlcy5iaW4gPC0gdG9fZmFjdG9yKEFFREIkTWFjcm9waGFnZXMuYmluKQpBRURCJFNNQy5iaW4gPC0gdG9fZmFjdG9yKEFFREIkU01DLmJpbikKQUVEQiRJUEguYmluIDwtIHRvX2ZhY3RvcihBRURCJElQSC5iaW4pCkFFREIkQ2FsYy5iaW4gPC0gdG9fZmFjdG9yKEFFREIkQ2FsYy5iaW4pCkFFREIkQ29sbGFnZW4uYmluIDwtIHRvX2ZhY3RvcihBRURCJENvbGxhZ2VuLmJpbikKQUVEQiRGYXQuYmluXzEwIDwtIHRvX2ZhY3RvcihBRURCJEZhdC5iaW5fMTApCkFFREIkRmF0LmJpbl80MCA8LSB0b19mYWN0b3IoQUVEQiRGYXQuYmluXzQwKQoKdGFibGUoQUVEQiRNYWNyb3BoYWdlcy5iaW4pCnRhYmxlKEFFREIkRmF0LmJpbl8xMCkKdGFibGUoQUVEQiRDb2xsYWdlbi5iaW4pCnRhYmxlKEFFREIkU01DLmJpbikKdGFibGUoQUVEQiRJUEguYmluKQoKIyBTUFNTIGNvZGUKCiMgCiMgKioqIHN5bnRheC0gUGxhcXVlIHZ1bG5lcmFiaWxpdHkqKi4KIyBDT01QVVRFIE1hY3JvX2luc3RhYiA9IC05OTkuCiMgSUYgbWFjcm9waGFnZXMuYmluPTIgTWFjcm9faW5zdGFiPTEuCiMgSUYgbWFjcm9waGFnZXMuYmluPTEgTWFjcm9faW5zdGFiPTAuCiMgRVhFQ1VURS4KIyAKIyBDT01QVVRFIEZhdDEwX2luc3RhYiA9IC05OTkuCiMgSUYgRmF0LmJpbl8xMD0yIEZhdDEwX2luc3RhYj0xLgojIElGIEZhdC5iaW5fMTA9MSBGYXQxMF9pbnN0YWI9MC4KIyBFWEVDVVRFLgojIAojIENPTVBVVEUgY29sbF9pbnN0YWI9LTk5OS4KIyBJRiBDb2xsYWdlbi5iaW49MiBjb2xsX2luc3RhYj0wLgojIElGIENvbGxhZ2VuLmJpbj0xIGNvbGxfaW5zdGFiPTEuCiMgRVhFQ1VURS4KIyAKIyAKIyBDT01QVVRFIFNNQ19pbnN0YWI9LTk5OS4KIyBJRiBTTUMuYmluPTIgU01DX2luc3RhYj0wLgojIElGIFNNQy5iaW49MSBTTUNfaW5zdGFiPTEuCiMgRVhFQ1VURS4KIyAKIyBDT01QVVRFIElQSF9pbnN0YWI9LTk5OS4KIyBJRiBJUEguYmluPTAgSVBIX2luc3RhYj0wLgojIElGIElQSC5iaW49MSBJUEhfaW5zdGFiPTEuCiMgRVhFQ1VURS4KIyAKIyBDT01QVVRFIEluc3RhYmlsaXR5PU1hY3JvX2luc3RhYiArIEZhdDEwX2luc3RhYiArICBjb2xsX2luc3RhYiArIFNNQ19pbnN0YWIgKyBJUEhfaW5zdGFiLgojIEVYRUNVVEUuCgojIEZpeCBwbGFxdWVwaGVub3R5cGVzCmF0dGFjaChBRURCKQojIG1hYyBpbnN0YWJpbGl0eQpBRURCWywiTUFDX0luc3RhYmlsaXR5Il0gPC0gTkEKQUVEQiRNQUNfSW5zdGFiaWxpdHlbTWFjcm9waGFnZXMuYmluID09IC05OTldIDwtIE5BCkFFREIkTUFDX0luc3RhYmlsaXR5W01hY3JvcGhhZ2VzLmJpbiA9PSAibm8vbWlub3IiXSA8LSAwCkFFREIkTUFDX0luc3RhYmlsaXR5W01hY3JvcGhhZ2VzLmJpbiA9PSAibW9kZXJhdGUvaGVhdnkiXSA8LSAxCgojIGZhdCBpbnN0YWJpbGl0eQpBRURCWywiRkFUMTBfSW5zdGFiaWxpdHkiXSA8LSBOQQpBRURCJEZBVDEwX0luc3RhYmlsaXR5W0ZhdC5iaW5fMTAgPT0gLTk5OV0gPC0gTkEKQUVEQiRGQVQxMF9JbnN0YWJpbGl0eVtGYXQuYmluXzEwID09ICIgPDEwJSJdIDwtIDAKQUVEQiRGQVQxMF9JbnN0YWJpbGl0eVtGYXQuYmluXzEwID09ICIgPjEwJSJdIDwtIDEKCiMgY29sIGluc3RhYmlsaXR5IApBRURCWywiQ09MX0luc3RhYmlsaXR5Il0gPC0gTkEKQUVEQiRDT0xfSW5zdGFiaWxpdHlbQ29sbGFnZW4uYmluID09IC05OTldIDwtIE5BCkFFREIkQ09MX0luc3RhYmlsaXR5W0NvbGxhZ2VuLmJpbiA9PSAibm8vbWlub3IiXSA8LSAxCkFFREIkQ09MX0luc3RhYmlsaXR5W0NvbGxhZ2VuLmJpbiA9PSAibW9kZXJhdGUvaGVhdnkiXSA8LSAwCgojIHNtYyBpbnN0YWJpbGl0eQpBRURCWywiU01DX0luc3RhYmlsaXR5Il0gPC0gTkEKQUVEQiRTTUNfSW5zdGFiaWxpdHlbU01DLmJpbiA9PSAtOTk5XSA8LSBOQQpBRURCJFNNQ19JbnN0YWJpbGl0eVtTTUMuYmluID09ICJuby9taW5vciJdIDwtIDEKQUVEQiRTTUNfSW5zdGFiaWxpdHlbU01DLmJpbiA9PSAibW9kZXJhdGUvaGVhdnkiXSA8LSAwCgojIGlwaCBpbnN0YWJpbGl0eQpBRURCWywiSVBIX0luc3RhYmlsaXR5Il0gPC0gTkEKQUVEQiRJUEhfSW5zdGFiaWxpdHlbSVBILmJpbiA9PSAtOTk5XSA8LSBOQQpBRURCJElQSF9JbnN0YWJpbGl0eVtJUEguYmluID09ICJubyJdIDwtIDAKQUVEQiRJUEhfSW5zdGFiaWxpdHlbSVBILmJpbiA9PSAieWVzIl0gPC0gMQoKZGV0YWNoKEFFREIpCgp0YWJsZShBRURCJE1BQ19JbnN0YWJpbGl0eSwgdXNlTkEgPSAiaWZhbnkiKQp0YWJsZShBRURCJEZBVDEwX0luc3RhYmlsaXR5LCB1c2VOQSA9ICJpZmFueSIpCnRhYmxlKEFFREIkQ09MX0luc3RhYmlsaXR5LCB1c2VOQSA9ICJpZmFueSIpCnRhYmxlKEFFREIkU01DX0luc3RhYmlsaXR5LCB1c2VOQSA9ICJpZmFueSIpCnRhYmxlKEFFREIkSVBIX0luc3RhYmlsaXR5LCB1c2VOQSA9ICJpZmFueSIpCgojIGNyZWF0aW5nIHZ1bG5lcmFiaWxpdHkgaW5kZXgKQUVEQiA8LSBBRURCICU+JSBtdXRhdGUoUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXggPSBmYWN0b3Iocm93U3VtcyguW2dyZXAoIl9JbnN0YWJpbGl0eSIsIG5hbWVzKC4pKV0sIG5hLnJtID0gVFJVRSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKCnRhYmxlKEFFREIkUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgsIHVzZU5BID0gImlmYW55IikKCiMgc3RyKEFFREIkUGxhcXVlX1Z1bG5lcmFiaWxpdHlfSW5kZXgpCgpgYGAKCiMjIEF0aGVyby1FeHByZXNzIEJpb2JhbmsgU3R1ZHkKCiMjIyBQcmVwYXJlIGJhc2VsaW5lIHN1bW1hcnkKCldlIGFyZSBpbnRlcmVzdGVkIGluIHRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGF0IGJhc2VsaW5lLgoKLSAgIEFnZSAoeWVhcnMpCgotICAgRmVtYWxlIHNleCAoTiwgJSkKCi0gICBIeXBlcnRlbnNpb24gKE4sICUpCgotICAgU0JQIChtbUhnKQoKLSAgIERCUCAobW1IZykKCi0gICBEaWFiZXRlcyBtZWxsaXR1cyAoTiwgJSkKCi0gICBUb3RhbCBjaG9sZXN0ZXJvbCBsZXZlbHMgKG1nL2RMKQoKLSAgIExETCBjaG9sZXN0ZXJvbCBsZXZlbHMgKG1nL2RMKQoKLSAgIEhETCBjaG9sZXN0ZXJvbCBsZXZlbHMgKG1nL2RMKQoKLSAgIFRyaWdseWNlcmlkZSBsZXZlbHMgKG1nL2RMKQoKLSAgIFVzZSBvZiBzdGF0aW5zIChOLCAlKQoKLSAgIFVzZSBvZiBhbnRpcGxhdGVsZXQgZHJ1Z3MgKE4sICUpCgotICAgQk1JIChrZy9twrIpCgotICAgU21va2luZyBzdGF0dXMgKE4sICUpCgogICAgLSAgIE5ldmVyIHNtb2tlcnMKICAgIC0gICBFeC1zbW9rZXJzCiAgICAtICAgQ3VycmVudCBzbW9rZXJzCgotICAgSGlzdG9yeSBvZiBDQUQgKE4sICUpCgotICAgSGlzdG9yeSBvZiBQQUQgKE4sICUpCgotICAgQ2xpbmljYWwgbWFuaWZlc3RhdGlvbnMKCiAgICAtICAgQXN5bXB0b21hdGljCiAgICAtICAgQW1hdXJvc2lzIGZ1Z2F4CiAgICAtICAgVElBCiAgICAtICAgU3Ryb2tlCgotICAgZUdGUiAobUwvbWluLzEuNzMgbcKyKQoKLSAgIHN0ZW5vc2lzCgotICAgeWVhciBvZiBzdXJnZXJ5CgotICAgcGxhcXVlIGNoYXJhY3RlcmlzdGljcwoKYGBge3IgQmFzZWxpbmUgQUVEQjogY3JlYXRpb24sIGluY2x1ZGUgPSBGQUxTRX0KY2F0KCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iKQpjYXQoIlNFTEVDVElPTiBUSEUgU0hJWlpMRVxuIikKCiMjIyBBcnRlcnkgbGV2ZWxzCiMgQUVkYXRhJEFydGVyeV9zdW1tYXJ5OiAKIyAgICAgICAgICAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsCiMgTk9UIFVTRSAtIDAgTm8gYXJ0ZXJ5IGtub3duICh5ZXQpLCBubyBzdXJnZXJ5IChwYXRpZW50IGlsbCwgZGllZCwgZXhpdGVkIHN0dWR5KSwgcmUtbnVtYmVyZWQgdG8gQUFBCiMgVVNFIC0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcm90aWQgKGxlZnQgJiByaWdodCkKIyBVU0UgLSAyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmZW1vcmFsL2lsaWFjIChsZWZ0LCByaWdodCBvciBib3RoIHNpZGVzKQojIE5PVCBVU0UgLSAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlciBjYXJvdGlkIGFydGVyaWVzIChjb21tb24sIGV4dGVybmFsKQojIE5PVCBVU0UgLSA0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXJvdGlkIGJ5cGFzcyBhbmQgaW5qdXJ5IChsZWZ0LCByaWdodCBvciBib3RoIHNpZGVzKQojIE5PVCBVU0UgLSA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYW5ldXJ5c21hdGEgKGNhcm90aWQgJiBmZW1vcmFsKQojIE5PVCBVU0UgLSA2ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhb3J0YQojIE5PVCBVU0UgLSA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlciBhcnRlcmllcyAocmVuYWwsIHBvcGxpdGVhbCwgdmVydGVicmFsKQojIE5PVCBVU0UgLSA4ICAgICAgICAgICAgICAgICAgICAgICAgZmVtb3JhbCBieXBhc3MsIGFuZ2lvc2VhbCBhbmQgaW5qdXJ5IChsZWZ0LCByaWdodCBvciBib3RoIHNpZGVzKQoKIyMjIEFFZGF0YSRpbmZvcm1lZGNvbnNlbnQKIyAgICAgICAgICAgdmFsdWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwKIyBOT1QgVVNFIC0gLTk5OSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZwojIE5PVCBVU0UgLSAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vLCBkaWVkCiMgVVNFIC0gMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcwojIFVTRSAtIDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUKIyBVU0UgLSAzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBoZWFsdGggdHJlYXRtZW50CiMgVVNFIC0gNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gY29tbWVyY2lhbCBidXNpbmVzcwojIE5PVCBVU0UgLSA1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gdGlzc3VlLCBubyBjb21tZXJpY2FsIGJ1c2luZXNzCiMgTk9UIFVTRSAtIDYgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBVU0UgLSA3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJjaWFsIGJ1c2luZXNzCiMgVVNFIC0gOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gcXVlc3Rpb25uYWlyZXMsIGhlYWx0aCB0cmVhdG1lbnQgd2hlbiBwb3NzaWJsZQojIE5PVCBVU0UgLSA5ICAgICAgICAgICAgICAgICAgeWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJpY2FsIGJ1c2luZXNzCiMgVVNFIC0gMTAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBOT1QgVVNFIC0gMTEgeWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBVU0UgLSAxMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudAojIE5PVCBVU0UgLSAxMyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHRpc3N1ZSwgbm8gaGVhbHRoIHRyZWF0bWVudAojIE5PVCBVU0UgLSAxNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcwojIE5PVCBVU0UgLSAxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyB0aXNzdWUsIGhlYWx0aCB0cmVhdG1lbnQgd2hlbiBwb3NzaWJsZQojIE5PVCBVU0UgLSAxNiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHRpc3N1ZQojIFVTRSAtIDE3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBjb21tZXJpY2FsIGJ1c2luZXNzCiMgVVNFIC0gMTggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBVU0UgLSAxOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcwojIFVTRSAtIDIwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHF1ZXN0aW9ubmFpcmVzCiMgTk9UIFVTRSAtIDIxICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvCiMgTk9UIFVTRSAtIDIyICAgICAgICAgICAgICAgICAgeWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJjaWFsIGJ1c2luZXNzCiMgVVNFIC0gMjMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBtZWRpY2FsIGluZm8KIyBVU0UgLSAyNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBxdWVzdGlvbm5haXJlcywgbm8gY29tbWVyY2lhbCBidXNpbmVzcwojIFVTRSAtIDI1ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvCiMgVVNFIC0gMjYgICAgICAgICAgICAgICAgICB5ZXMsIG5vIHF1ZXN0aW9ubmFpcmVzLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MKIyBVU0UgLSAyNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHllcywgIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIG1lZGljYWwgaW5mbwojIE5PVCBVU0UgLSAyOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8sIGRvZXNuJ3Qgd2FudCB0bwojIE5PVCBVU0UgLSAyOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vLCB1bmFibGUgdG8gc2lnbgojIE5PVCBVU0UgLSAzMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vLCBubyByZWFjdGlvbgojIE5PVCBVU0UgLSAzMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubywgbG9zdAojIE5PVCBVU0UgLSAzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBubywgdG9vIG9sZAojIE5PVCBVU0UgLSAzNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWVzLCBubyBtZWRpY2FsIGluZm8sIGhlYWx0aCB0cmVhdG1lbnQgd2hlbiBwb3NzaWJsZQojIE5PVCBVU0UgLSAzNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vIChuZXZlciBhc2tlZCBmb3IgSUMgYmVjYXVzZSB0aGVyZSB3YXMgbm8gdGlzc3VlKQojIFVTRSAtIDM2ICAgICAgICAgICAgICAgICAgICB5ZXMsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcywgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlCiMgTk9UIFVTRSAtIDM3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbm8sIGVuZHBvaW50CiMgVVNFIC0gMzggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aWwgbmlldHMgaW52dWxsZW4sIHdlbCBhbGxlcyBnZWJydWlrZW4KIyBVU0UgLSAzOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWNvbmQgaW5mb3JtZWQgY29uY2VudHM6IHllcywgbm8gY29tbWVyY2lhbCBidXNpbmVzcwojIE5PVCBVU0UgLSA0MCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vb2l0IGdlaW5jbHVkZWVyZAoKY2F0KCItIHNhbml0eSBjaGVja2luZyBQUklPUiB0byBzZWxlY3Rpb24iKQpsaWJyYXJ5KGRhdGEudGFibGUpCmFlLmdlbmRlciA8LSBpZmVsc2UoQUVEQiRHZW5kZXIgPT0gMCwgIkZlbWFsZSIsICJNYWxlIikKYWUuaG9zcGl0YWwgPC0gaWZlbHNlKEFFREIkSG9zcGl0YWwgPT0gMSwgIkFudG9uaXVzIiwgIlVNQ1UiKQp0YWJsZShhZS5nZW5kZXIsIGFlLmhvc3BpdGFsLCBkbm4gPSBjKCJTZXgiLCAiSG9zcGl0YWwiKSkKYWUuZ2VuZGVyIDwtIGlmZWxzZShBRURCJEdlbmRlciA9PSAwLCAiRmVtYWxlIiwgIk1hbGUiKQp0YWJsZShhZS5nZW5kZXIsIEFFREIkQXJ0ZXJ5X3N1bW1hcnksIGRubiA9IGMoIlNleCIsICJBcnRlcnkiKSkKIyB0YWJsZShhZS5nZW5kZXIsIEFFREIkaW5mb3JtZWRjb25zZW50LCBkbm4gPSBjKCJTZXgiLCAiSUMiKSkKCnJtKGFlLmdlbmRlciwgYWUuaG9zcGl0YWwpCgojIEkgY2hhbmdlIG51bWVyaWMgYW5kIGZhY3RvcnMgbWFudWFsbHkgYmVjYXVzZSwgd2VsbCwgSSB3b3VsZG4ndCBrbm93IGhvdyB0byBmaXggaXQgb3RoZXJ3aXNlCiMgdG8gaGF2ZSB0aGlzICd0aWJibGUnIHdvcmsgd2l0aCAndGFibGVvbmUnLi4uIDotKQoKQUVEQiRBZ2UgPC0gYXMubnVtZXJpYyhBRURCJEFnZSkKQUVEQiRkaWFzdG9saSA8LSBhcy5udW1lcmljKEFFREIkZGlhc3RvbGkpCkFFREIkc3lzdG9saWMgPC0gYXMubnVtZXJpYyhBRURCJHN5c3RvbGljKQoKQUVEQiRUQ19maW5hbENVIDwtIGFzLm51bWVyaWMoQUVEQiRUQ19maW5hbENVKQpBRURCJExETF9maW5hbENVIDwtIGFzLm51bWVyaWMoQUVEQiRMRExfZmluYWxDVSkKQUVEQiRIRExfZmluYWxDVSA8LSBhcy5udW1lcmljKEFFREIkSERMX2ZpbmFsQ1UpCkFFREIkVEdfZmluYWxDVSA8LSBhcy5udW1lcmljKEFFREIkVEdfZmluYWxDVSkKCkFFREIkVENfZmluYWwgPC0gYXMubnVtZXJpYyhBRURCJFRDX2ZpbmFsKQpBRURCJExETF9maW5hbCA8LSBhcy5udW1lcmljKEFFREIkTERMX2ZpbmFsKQpBRURCJEhETF9maW5hbCA8LSBhcy5udW1lcmljKEFFREIkSERMX2ZpbmFsKQpBRURCJFRHX2ZpbmFsIDwtIGFzLm51bWVyaWMoQUVEQiRUR19maW5hbCkKCkFFREIkQWdlIDwtIGFzLm51bWVyaWMoQUVEQiRBZ2UpCkFFREIkR0ZSX01EUkQgPC0gYXMubnVtZXJpYyhBRURCJEdGUl9NRFJEKQpBRURCJEJNSSA8LSBhcy5udW1lcmljKEFFREIkQk1JKQpBRURCJGVDaWdhcmV0dGVzIDwtIGFzLm51bWVyaWMoQUVEQiRlQ2lnYXJldHRlcykKQUVEQiRlUGFja1llYXJzU21va2luZyA8LSBhcy5udW1lcmljKEFFREIkZVBhY2tZZWFyc1Ntb2tpbmcpCkFFREIkRVBfY29tcG9zaXRlX3RpbWUgPC0gYXMubnVtZXJpYyhBRURCJEVQX2NvbXBvc2l0ZV90aW1lKQoKcmVxdWlyZShsYWJlbGxlZCkKQUVEQiRPUnllYXIgPC0gdG9fZmFjdG9yKEFFREIkT1J5ZWFyKQpBRURCJEdlbmRlciA8LSB0b19mYWN0b3IoQUVEQiRHZW5kZXIpCkFFREIkSG9zcGl0YWwgPC0gdG9fZmFjdG9yKEFFREIkSG9zcGl0YWwpCkFFREIkS0RPUUkgPC0gdG9fZmFjdG9yKEFFREIkS0RPUUkpCkFFREIkQk1JX1dITyA8LSB0b19mYWN0b3IoQUVEQiRCTUlfV0hPKQpBRURCJERpYWJldGVzU3RhdHVzIDwtIHRvX2ZhY3RvcihBRURCJERpYWJldGVzU3RhdHVzKQpBRURCJFNtb2tlclN0YXR1cyA8LSB0b19mYWN0b3IoQUVEQiRTbW9rZXJTdGF0dXMpCkFFREIkQWxjb2hvbFVzZSA8LSB0b19mYWN0b3IoQUVEQiRBbGNvaG9sVXNlKQoKQUVEQiRIeXBlcnRlbnNpb24uc2VsZnJlcG9ydCA8LSB0b19mYWN0b3IoQUVEQiRIeXBlcnRlbnNpb24xKQpBRURCJEh5cGVydGVuc2lvbi5zZWxmcmVwb3J0ZHJ1ZyA8LSB0b19mYWN0b3IoQUVEQiRIeXBlcnRlbnNpb24yKQpBRURCJEh5cGVydGVuc2lvbi5jb21wb3NpdGUgPC0gdG9fZmFjdG9yKEFFREIkSHlwZXJ0ZW5zaW9uLmNvbXBvc2l0ZSkKQUVEQiRIeXBlcnRlbnNpb24uZHJ1Z3MgPC0gdG9fZmFjdG9yKEFFREIkSHlwZXJ0ZW5zaW9uLmRydWdzKQoKQUVEQiRNZWQuYW50aWNvYWd1bGFudHMgPC0gdG9fZmFjdG9yKEFFREIkTWVkLmFudGljb2FndWxhbnRzKQpBRURCJE1lZC5hbGwuYW50aXBsYXRlbGV0IDwtIHRvX2ZhY3RvcihBRURCJE1lZC5hbGwuYW50aXBsYXRlbGV0KQpBRURCJE1lZC5TdGF0aW4uTExEIDwtIHRvX2ZhY3RvcihBRURCJE1lZC5TdGF0aW4uTExEKQoKQUVEQiRTdHJva2VfRHggPC0gdG9fZmFjdG9yKEFFREIkU3Ryb2tlX0R4KQpBRURCJENBRF9oaXN0b3J5IDwtIHRvX2ZhY3RvcihBRURCJENBRF9oaXN0b3J5KQpBRURCJFBBT0QgPC0gdG9fZmFjdG9yKEFFREIkUEFPRCkKQUVEQiRQZXJpcGhlcmFsLmludGVydiA8LSB0b19mYWN0b3IoQUVEQiRQZXJpcGhlcmFsLmludGVydikKQUVEQiRNZWRIeF9DVkQgPC0gdG9fZmFjdG9yKEFFREIkTWVkSHhfQ1ZEKQoKCkFFREIkc3ltcHQgPC0gdG9fZmFjdG9yKEFFREIkc3ltcHQpCkFFREIkU3ltcHRvbXMuM2cgPC0gdG9fZmFjdG9yKEFFREIkU3ltcHRvbXMuM2cpCkFFREIkU3ltcHRvbXMuNGcgPC0gdG9fZmFjdG9yKEFFREIkU3ltcHRvbXMuNGcpCkFFREIkU3ltcHRvbXMuNUcgPC0gdG9fZmFjdG9yKEFFREIkU3ltcHRvbXMuNUcpCkFFREIkQXN5bXB0U3ltcHQgPC0gdG9fZmFjdG9yKEFFREIkQXN5bXB0U3ltcHQpCkFFREIkQXN5bXB0U3ltcHQyRyA8LSB0b19mYWN0b3IoQUVEQiRBc3ltcHRTeW1wdDJHKQoKCkFFREIkcmVzdGVub3MgPC0gdG9fZmFjdG9yKEFFREIkcmVzdGVub3MpCkFFREIkc3Rlbm9zZSA8LSB0b19mYWN0b3IoQUVEQiRzdGVub3NlKQpBRURCJEVQX2NvbXBvc2l0ZSA8LSB0b19mYWN0b3IoQUVEQiRFUF9jb21wb3NpdGUpCkFFREIkTWFjcm9waGFnZXMuYmluIDwtIHRvX2ZhY3RvcihBRURCJE1hY3JvcGhhZ2VzLmJpbikKQUVEQiRTTUMuYmluIDwtIHRvX2ZhY3RvcihBRURCJFNNQy5iaW4pCkFFREIkSVBILmJpbiA8LSB0b19mYWN0b3IoQUVEQiRJUEguYmluKQpBRURCJENhbGMuYmluIDwtIHRvX2ZhY3RvcihBRURCJENhbGMuYmluKQpBRURCJENvbGxhZ2VuLmJpbiA8LSB0b19mYWN0b3IoQUVEQiRDb2xsYWdlbi5iaW4pCkFFREIkRmF0LmJpbl8xMCA8LSB0b19mYWN0b3IoQUVEQiRGYXQuYmluXzEwKQpBRURCJEZhdC5iaW5fNDAgPC0gdG9fZmFjdG9yKEFFREIkRmF0LmJpbl80MCkKQUVEQiRPdmVyYWxsUGxhcXVlUGhlbm90eXBlIDwtIHRvX2ZhY3RvcihBRURCJE92ZXJhbGxQbGFxdWVQaGVub3R5cGUpCgpBRURCJEFydGVyeV9zdW1tYXJ5IDwtIHRvX2ZhY3RvcihBRURCJEFydGVyeV9zdW1tYXJ5KQoKQUVEQiRpbmZvcm1lZGNvbnNlbnQgPC0gdG9fZmFjdG9yKEFFREIkaW5mb3JtZWRjb25zZW50KQoKQUVEQi5DRUEgPC0gc3Vic2V0KEFFREIsCiAgICAgICAgICAgICAgICAgICAgKEFydGVyeV9zdW1tYXJ5ID09ICJjYXJvdGlkIChsZWZ0ICYgcmlnaHQpIiB8IEFydGVyeV9zdW1tYXJ5ID09ICJvdGhlciBjYXJvdGlkIGFydGVyaWVzIChjb21tb24sIGV4dGVybmFsKSIpICYgIyB3ZSBvbmx5IHdhbnQgY2Fyb3RpZHMKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm1pc3NpbmciICYgIyB3ZSBhcmUgcmVhbGx5IHN0cmljdCBpbiBzZWxlY3RpbmcgYmFzZWQgb24gJ2luZm9ybWVkIGNvbnNlbnQnIQogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGRpZWQiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBjb21tZXJpY2FsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJpY2FsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIGhlYWx0aCB0cmVhdG1lbnQiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIGhlYWx0aCB0cmVhdG1lbnQgd2hlbiBwb3NzaWJsZSIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBkb2Vzbid0IHdhbnQgdG8iICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCB1bmFibGUgdG8gc2lnbiIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIG5vIHJlYWN0aW9uIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubywgbG9zdCIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIHRvbyBvbGQiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gbWVkaWNhbCBpbmZvLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vIChuZXZlciBhc2tlZCBmb3IgSUMgYmVjYXVzZSB0aGVyZSB3YXMgbm8gdGlzc3VlKSIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGVuZHBvaW50IiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJub29pdCBnZWluY2x1ZGVlcmQiKQojIEFFREIuQ0VBWzE6MTAsIDE6MTBdCmRpbShBRURCLkNFQSkKCkFFREIuZnVsbCA8LSBzdWJzZXQoQUVEQiwKICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm1pc3NpbmciICYgIyB3ZSBhcmUgcmVhbGx5IHN0cmljdCBpbiBzZWxlY3RpbmcgYmFzZWQgb24gJ2luZm9ybWVkIGNvbnNlbnQnIQogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGRpZWQiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBjb21tZXJpY2FsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJpY2FsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIG1lZGljYWwgaW5mbywgbm8gY29tbWVyY2lhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIGhlYWx0aCB0cmVhdG1lbnQiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcyIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIGhlYWx0aCB0cmVhdG1lbnQgd2hlbiBwb3NzaWJsZSIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gcXVlc3Rpb25uYWlyZXMsIG5vIGhlYWx0aCB0cmVhdG1lbnQsIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBkb2Vzbid0IHdhbnQgdG8iICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCB1bmFibGUgdG8gc2lnbiIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIG5vIHJlYWN0aW9uIiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJubywgbG9zdCIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIHRvbyBvbGQiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gbWVkaWNhbCBpbmZvLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUiICYKICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vIChuZXZlciBhc2tlZCBmb3IgSUMgYmVjYXVzZSB0aGVyZSB3YXMgbm8gdGlzc3VlKSIgJgogICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGVuZHBvaW50IiAmCiAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJub29pdCBnZWluY2x1ZGVlcmQiKQojIEFFREIuQ0VBWzE6MTAsIDE6MTBdCmRpbShBRURCLmZ1bGwpCgpgYGAKCmBgYHtyfQpjYXQoIj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiIpCmNhdCgiQ1JFQVRFIEJBU0VMSU5FIFRBQkxFXG4iKQoKIyBCYXNlbGluZSB0YWJsZSB2YXJpYWJsZXMKYmFzZXRhYmxlX3ZhcnMgPSBjKCJIb3NwaXRhbCIsICJPUnllYXIiLAogICAgICAgICAgICAgICAgICAgIkFnZSIsICJHZW5kZXIiLCAKICAgICAgICAgICAgICAgICAgICJUQ19maW5hbENVIiwgIkxETF9maW5hbENVIiwgIkhETF9maW5hbENVIiwgIlRHX2ZpbmFsQ1UiLCAKICAgICAgICAgICAgICAgICAgICJUQ19maW5hbCIsICJMRExfZmluYWwiLCAiSERMX2ZpbmFsIiwgIlRHX2ZpbmFsIiwgCiAgICAgICAgICAgICAgICAgICAic3lzdG9saWMiLCAiZGlhc3RvbGkiLCAiR0ZSX01EUkQiLCAiQk1JIiwgCiAgICAgICAgICAgICAgICAgICAiS0RPUUkiLCAiQk1JX1dITyIsCiAgICAgICAgICAgICAgICAgICAiU21va2VyU3RhdHVzIiwgIkFsY29ob2xVc2UiLAogICAgICAgICAgICAgICAgICAgIkRpYWJldGVzU3RhdHVzIiwgCiAgICAgICAgICAgICAgICAgICAiSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQiLCAiSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnRkcnVnIiwgIkh5cGVydGVuc2lvbi5jb21wb3NpdGUiLCAiSHlwZXJ0ZW5zaW9uLmRydWdzIiwgCiAgICAgICAgICAgICAgICAgICAiTWVkLmFudGljb2FndWxhbnRzIiwgIk1lZC5hbGwuYW50aXBsYXRlbGV0IiwgIk1lZC5TdGF0aW4uTExEIiwgCiAgICAgICAgICAgICAgICAgICAiU3Ryb2tlX0R4IiwgInN5bXB0IiwgIlN5bXB0b21zLjVHIiwgIkFzeW1wdFN5bXB0IiwgCiAgICAgICAgICAgICAgICAgICAicmVzdGVub3MiLCAic3Rlbm9zZSIsCiAgICAgICAgICAgICAgICAgICAiTWVkSHhfQ1ZEIiwgIkNBRF9oaXN0b3J5IiwgIlBBT0QiLCAiUGVyaXBoZXJhbC5pbnRlcnYiLCAKICAgICAgICAgICAgICAgICAgICJFUF9jb21wb3NpdGUiLCAiRVBfY29tcG9zaXRlX3RpbWUiLAogICAgICAgICAgICAgICAgICAgIm1hY21lYW4wIiwgInNtY21lYW4wIiwgIk1hY3JvcGhhZ2VzLmJpbiIsICJTTUMuYmluIiwKICAgICAgICAgICAgICAgICAgICJuZXV0cm9waGlscyIsICJNYXN0X2NlbGxzX3BsYXF1ZSIsCiAgICAgICAgICAgICAgICAgICAiSVBILmJpbiIsICJ2ZXNzZWxfZGVuc2l0eV9hdmVyYWdlZCIsCiAgICAgICAgICAgICAgICAgICAiQ2FsYy5iaW4iLCAiQ29sbGFnZW4uYmluIiwgCiAgICAgICAgICAgICAgICAgICAiRmF0LmJpbl8xMCIsICJGYXQuYmluXzQwIiwgIk92ZXJhbGxQbGFxdWVQaGVub3R5cGUiLAogICAgICAgICAgICAgICAgICAgIlNNQ19yYW5rTm9ybSIsICJNQUNfcmFua05vcm0iLCAiTmV1dHJvcGhpbHNfcmFua05vcm0iLCAiTWFzdENlbGxzX3JhbmtOb3JtIiwgIlZlc3NlbERlbnNpdHlfcmFua05vcm0iKQoKYmFzZXRhYmxlX2JpbiA9IGMoIkdlbmRlciIsIAogICAgICAgICAgICAgICAgICAiS0RPUUkiLCAiQk1JX1dITyIsCiAgICAgICAgICAgICAgICAgICJTbW9rZXJTdGF0dXMiLCAiQWxjb2hvbFVzZSIsCiAgICAgICAgICAgICAgICAgICJEaWFiZXRlc1N0YXR1cyIsIAogICAgICAgICAgICAgICAgICAiSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnQiLCAiSHlwZXJ0ZW5zaW9uLnNlbGZyZXBvcnRkcnVnIiwgIkh5cGVydGVuc2lvbi5jb21wb3NpdGUiLCAiSHlwZXJ0ZW5zaW9uLmRydWdzIiwgCiAgICAgICAgICAgICAgICAgICJNZWQuYW50aWNvYWd1bGFudHMiLCAiTWVkLmFsbC5hbnRpcGxhdGVsZXQiLCAiTWVkLlN0YXRpbi5MTEQiLCAKICAgICAgICAgICAgICAgICAgIlN0cm9rZV9EeCIsICJzeW1wdCIsICJTeW1wdG9tcy41RyIsICJBc3ltcHRTeW1wdCIsIAogICAgICAgICAgICAgICAgICAicmVzdGVub3MiLCAic3Rlbm9zZSIsCiAgICAgICAgICAgICAgICAgICJDQURfaGlzdG9yeSIsICJQQU9EIiwgIlBlcmlwaGVyYWwuaW50ZXJ2IiwgCiAgICAgICAgICAgICAgICAgICJFUF9jb21wb3NpdGUiLCAiTWFjcm9waGFnZXMuYmluIiwgIlNNQy5iaW4iLAogICAgICAgICAgICAgICAgICAiSVBILmJpbiIsIAogICAgICAgICAgICAgICAgICAiQ2FsYy5iaW4iLCAiQ29sbGFnZW4uYmluIiwgCiAgICAgICAgICAgICAgICAgICJGYXQuYmluXzEwIiwgIkZhdC5iaW5fNDAiLCAiT3ZlcmFsbFBsYXF1ZVBoZW5vdHlwZSIpCiMgYmFzZXRhYmxlX2JpbgoKYmFzZXRhYmxlX2NvbiA9IGJhc2V0YWJsZV92YXJzWyFiYXNldGFibGVfdmFycyAlaW4lIGJhc2V0YWJsZV9iaW5dCiMgYmFzZXRhYmxlX2NvbgpgYGAKCiMjIyBBbGwgcGF0aWVudHMKClNob3dpbmcgdGhlIGJhc2VsaW5lIHRhYmxlIG9mIHRoZSB3aG9sZSBBdGhlcm8tRXhwcmVzcyBCaW9iYW5rLgoKYGBge3IgQmFzZWxpbmUgQUVEQjogVmlzdWFsaXplIEFFREJ9CiMgQ3JlYXRlIGJhc2VsaW5lIHRhYmxlcwojIGh0dHA6Ly9yc3R1ZGlvLXB1YnMtc3RhdGljLnMzLmFtYXpvbmF3cy5jb20vMTMzMjFfZGEzMTQ2MzNkYjkyNGRjNzg5ODZhODUwODEzYTUwZDUuaHRtbApBRURCLnRhYmxlT25lID0gcHJpbnQoQ3JlYXRlVGFibGVPbmUodmFycyA9IGJhc2V0YWJsZV92YXJzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZhY3RvclZhcnMgPSBiYXNldGFibGVfYmluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3RyYXRhID0gIlN5bXB0b21zLjRnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gQUVEQi5mdWxsLCBpbmNsdWRlTkEgPSBUUlVFKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgbm9ubm9ybWFsID0gYygpLCBtaXNzaW5nID0gVFJVRSwKICAgICAgICAgICAgICAgICAgICAgICAgICBxdW90ZSA9IEZBTFNFLCBub1NwYWNlcyA9IEZBTFNFLCBzaG93QWxsTGV2ZWxzID0gVFJVRSwgZXhwbGFpbiA9IFRSVUUsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdCA9ICJwZiIsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnREaWdpdHMgPSAzKVssMTozXQpgYGAKCiMjIyBDRUEgcGF0aWVudHMKCmBgYHtyIEJhc2VsaW5lIEFFREI6IFZpc3VhbGl6ZSBBRURCIENFQX0KIyBDcmVhdGUgYmFzZWxpbmUgdGFibGVzCiMgaHR0cDovL3JzdHVkaW8tcHVicy1zdGF0aWMuczMuYW1hem9uYXdzLmNvbS8xMzMyMV9kYTMxNDYzM2RiOTI0ZGM3ODk4NmE4NTA4MTNhNTBkNS5odG1sCkFFREIuQ0VBLnRhYmxlT25lID0gcHJpbnQoQ3JlYXRlVGFibGVPbmUodmFycyA9IGJhc2V0YWJsZV92YXJzLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIGZhY3RvclZhcnMgPSBiYXNldGFibGVfYmluLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgc3RyYXRhID0gIlN5bXB0b21zLjRnIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gQUVEQi5DRUEsIGluY2x1ZGVOQSA9IFRSVUUpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBub25ub3JtYWwgPSBjKCksIG1pc3NpbmcgPSBUUlVFLAogICAgICAgICAgICAgICAgICAgICAgICAgIHF1b3RlID0gRkFMU0UsIG5vU3BhY2VzID0gRkFMU0UsIHNob3dBbGxMZXZlbHMgPSBUUlVFLCBleHBsYWluID0gVFJVRSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gInBmIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29udERpZ2l0cyA9IDMpWywxOjNdCmBgYAoKIyMgQXRoZXJvLUV4cHJlc3MgU2luZ2xlLUNlbGwgUk5BIFN0dWR5IChBRVNDUk5BKQoKIyMjIEJhc2VsaW5lIHN1bW1hcnkKCmBgYHtyIEJhc2VsaW5lOiBjcmVhdGlvbn0KbWV0YWRhdGEgPC0gc2NSTkFzZXFEYXRhQG1ldGEuZGF0YSAlPiUgYXNfdGliYmxlKCkKc2NSTkFzZXFEYXRhTWV0YSA8LSBtZXRhZGF0YSAlPiUgZGlzdGluY3QoUGF0aWVudCwgLmtlZXBfYWxsID0gVFJVRSkKCnNjUk5Bc2VxRGF0YU1ldGFBRSA8LSBtZXJnZShzY1JOQXNlcURhdGFNZXRhLCBBRURCLCBieS54ID0gIlBhdGllbnQiLCBieS55ID0gIlNUVURZX05VTUJFUiIsIHNvcnQgPSBGQUxTRSwgYWxsLnggPSBUUlVFKQpkaW0oc2NSTkFzZXFEYXRhTWV0YUFFKQoKIyBSZXBsYWNlIG1pc3NpbmcgZGF0YSAKIyBSZWY6IGh0dHBzOi8vY3Jhbi5yLXByb2plY3Qub3JnL3dlYi9wYWNrYWdlcy9uYW5pYXIvdmlnbmV0dGVzL3JlcGxhY2Utd2l0aC1uYS5odG1sCnJlcXVpcmUobmFuaWFyKQoKbmFfc3RyaW5ncyA8LSBjKCJOQSIsICJOIEEiLCAiTiAvIEEiLCAiTi9BIiwgIk4vIEEiLCAKICAgICAgICAgICAgICAgICJOb3QgQXZhaWxhYmxlIiwgIk5vdCBhdmFpbGFibGUiLCAKICAgICAgICAgICAgICAgICJtaXNzaW5nIiwgCiAgICAgICAgICAgICAgICAiLTk5OSIsICItOTkiLCAKICAgICAgICAgICAgICAgICJObyBkYXRhIGF2YWlsYWJsZS9taXNzaW5nIiwgIk5vIGRhdGEgYXZhaWxhYmxlL01pc3NpbmciKQojIFRoZW4geW91IHdyaXRlIH4ueCAlaW4lIG5hX3N0cmluZ3MgLSB3aGljaCByZWFkcyBhcyDigJxkb2VzIHRoaXMgdmFsdWUgb2NjdXIgaW4gdGhlIGxpc3Qgb2YgTkEgc3RyaW5nc+KAnS4KCnNjUk5Bc2VxRGF0YU1ldGFBRSAlPiUKICByZXBsYWNlX3dpdGhfbmFfYWxsKGNvbmRpdGlvbiA9IH4ueCAlaW4lIG5hX3N0cmluZ3MpCmBgYAoKCmBgYHtyIEJhc2VsaW5lOiBzZWxlY3Rpb259CmNhdCgiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSIpCmNhdCgiU0VMRUNUSU9OIFRIRSBTSElaWkxFIikKCmNhdCgiLSBzYW5pdHkgY2hlY2tpbmcgUFJJT1IgdG8gc2VsZWN0aW9uIikKbGlicmFyeShkYXRhLnRhYmxlKQpyZXF1aXJlKGxhYmVsbGVkKQphZS5nZW5kZXIgPC0gdG9fZmFjdG9yKHNjUk5Bc2VxRGF0YU1ldGFBRSRHZW5kZXIpCmFlLmhvc3BpdGFsIDwtIHRvX2ZhY3RvcihzY1JOQXNlcURhdGFNZXRhQUUkSG9zcGl0YWwpCnRhYmxlKGFlLmdlbmRlciwgYWUuaG9zcGl0YWwsIGRubiA9IGMoIlNleCIsICJIb3NwaXRhbCIpLCB1c2VOQSA9ICJpZmFueSIpCgphZS5hcnRlcnkgPC0gdG9fZmFjdG9yKHNjUk5Bc2VxRGF0YU1ldGFBRSRBcnRlcnlfc3VtbWFyeSkKdGFibGUoYWUuYXJ0ZXJ5LCBhZS5nZW5kZXIsIGRubiA9IGMoIlNleCIsICJBcnRlcnkiKSwgdXNlTkEgPSAiaWZhbnkiKQoKYWUuaWMgPC0gdG9fZmFjdG9yKHNjUk5Bc2VxRGF0YU1ldGFBRSRpbmZvcm1lZGNvbnNlbnQpCnRhYmxlKGFlLmljLCBhZS5nZW5kZXIsIHVzZU5BID0gImlmYW55IikKCnJtKGFlLmdlbmRlciwgYWUuaG9zcGl0YWwsIGFlLmFydGVyeSwgYWUuaWMpCgoKc2NSTkFzZXFEYXRhTWV0YUFFLmFsbCA8LSBzdWJzZXQoc2NSTkFzZXFEYXRhTWV0YUFFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFydGVyeV9zdW1tYXJ5ID09ICJjYXJvdGlkIChsZWZ0ICYgcmlnaHQpIiB8IEFydGVyeV9zdW1tYXJ5ID09ICJvdGhlciBjYXJvdGlkIGFydGVyaWVzIChjb21tb24sIGV4dGVybmFsKSIgKSAmICMgd2Ugb25seSB3YW50IGNhcm90aWRzCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibWlzc2luZyIgJiAjIHdlIGFyZSByZWFsbHkgc3RyaWN0IGluIHNlbGVjdGluZyBiYXNlZCBvbiAnaW5mb3JtZWQgY29uc2VudCchCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGRpZWQiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gY29tbWVyaWNhbCBidXNpbmVzcyIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gbWVkaWNhbCBpbmZvLCBubyBjb21tZXJjaWFsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJpY2FsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBtZWRpY2FsIGluZm8sIG5vIGNvbW1lcmNpYWwgYnVzaW5lc3MiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSwgbm8gaGVhbHRoIHRyZWF0bWVudCIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcyIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBoZWFsdGggdHJlYXRtZW50IHdoZW4gcG9zc2libGUiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIHRpc3N1ZSIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gInllcywgbm8gdGlzc3VlLCBubyBxdWVzdGlvbm5haXJlcywgbm8gaGVhbHRoIHRyZWF0bWVudCwgbm8gbWVkaWNhbCBpbmZvIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAieWVzLCBubyB0aXNzdWUsIG5vIHF1ZXN0aW9ubmFpcmVzLCBubyBoZWFsdGggdHJlYXRtZW50LCBubyBjb21tZXJjaWFsIGJ1c2luZXNzIiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIGRvZXNuJ3Qgd2FudCB0byIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCB1bmFibGUgdG8gc2lnbiIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBubyByZWFjdGlvbiIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBsb3N0IiAmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZm9ybWVkY29uc2VudCAhPSAibm8sIHRvbyBvbGQiICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtZWRjb25zZW50ICE9ICJ5ZXMsIG5vIG1lZGljYWwgaW5mbywgaGVhbHRoIHRyZWF0bWVudCB3aGVuIHBvc3NpYmxlIiAmIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vIChuZXZlciBhc2tlZCBmb3IgSUMgYmVjYXVzZSB0aGVyZSB3YXMgbm8gdGlzc3VlKSIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vLCBlbmRwb2ludCIgJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvcm1lZGNvbnNlbnQgIT0gIm5vb2l0IGdlaW5jbHVkZWVyZCIpCiMgc2NSTkFzZXFEYXRhTWV0YUFFLmFsbFsxOjEwLCAxOjEwXQpkaW0oc2NSTkFzZXFEYXRhTWV0YUFFLmFsbCkKIyBEVDo6ZGF0YXRhYmxlKHNjUk5Bc2VxRGF0YU1ldGFBRS5hbGwpCgpgYGAKClNob3dpbmcgdGhlIGJhc2VsaW5lIHRhYmxlLgoKYGBge3IgQmFzZWxpbmU6IFZpc3VhbGl6ZX0KY2F0KCI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IikKY2F0KCJDUkVBVEUgQkFTRUxJTkUgVEFCTEUiKQoKIyBDcmVhdGUgYmFzZWxpbmUgdGFibGVzCiMgaHR0cDovL3JzdHVkaW8tcHVicy1zdGF0aWMuczMuYW1hem9uYXdzLmNvbS8xMzMyMV9kYTMxNDYzM2RiOTI0ZGM3ODk4NmE4NTA4MTNhNTBkNS5odG1sCnNjUk5Bc2VxRGF0YU1ldGFBRS5hbGwudGFibGVPbmUgPSBwcmludChDcmVhdGVUYWJsZU9uZSh2YXJzID0gYmFzZXRhYmxlX3ZhcnMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgZmFjdG9yVmFycyA9IGJhc2V0YWJsZV9iaW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBzdHJhdGEgPSAiR2VuZGVyIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhID0gc2NSTkFzZXFEYXRhTWV0YUFFLmFsbCwgaW5jbHVkZU5BID0gVFJVRSksIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vbm5vcm1hbCA9IGMoKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVvdGUgPSBGQUxTRSwgc2hvd0FsbExldmVscyA9IFRSVUUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0ID0gInAiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250RGlnaXRzID0gMylbLDE6Ml0KCmBgYAoKIyMjIFNhdmluZyBiYXNlbGluZSBmb3IgQUVTQ1JOQQoKV3JpdGluZyB0aGUgYmFzZWxpbmUgdGFibGUgdG8gRXhjZWwgZm9ybWF0LgoKYGBge3IgQmFzZWxpbmU6IHdyaXRlfQojIFdyaXRlIGJhc2V0YWJsZQpyZXF1aXJlKG9wZW54bHN4KQp3cml0ZS54bHN4KGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLFRvZGF5LCIuIixQUk9KRUNUTkFNRSwiLkFFLkJhc2VsaW5lVGFibGUuc2NSTkFzZXEueGxzeCIpLAogICAgICAgICAgIGZvcm1hdChzY1JOQXNlcURhdGFNZXRhQUUuYWxsLnRhYmxlT25lLCBkaWdpdHMgPSA1LCBzY2llbnRpZmljID0gRkFMU0UpLCAKICAgICAgICAgICByb3dOYW1lcyA9IFRSVUUsIGNvbE5hbWVzID0gVFJVRSwgb3ZlcndyaXRlID0gVFJVRSkKCmBgYAoKIyBBRVNDUk5BCgojIyBRdWFsaXR5IGNvbnRyb2wKCkhlcmUgcmV2aWV3IHRoZSBudW1iZXIgb2YgY2VsbHMgcGVyIHNhbXBsZSwgcGxhdGUsIGFuZCBwYXRpZW50cy4gQW5kIHBsb3QgdGhlCnJhdGlvJ3MgcGVyIHNhbXBsZSBhbmQgc3R1ZHkgbnVtYmVyLgoKYGBge3IgUXVhbGl0eUNvbnRyb2x9CiMjIGNoZWNrIHN0dWZmCmNhdCgiXG5Ib3cgbWFueSBjZWxscyBwZXIgdHlwZSAuLi4/IikKc29ydCh0YWJsZShzY1JOQXNlcURhdGFAbWV0YS5kYXRhJFNDVF9zbm5fcmVzLjAuOCkpCgpjYXQoIlxuXG5Ib3cgbWFueSBjZWxscyBwZXIgcGxhdGUgLi4uPyIpCnNvcnQodGFibGUoc2NSTkFzZXFEYXRhQG1ldGEuZGF0YSRJRCkpCgpjYXQoIlxuXG5Ib3cgbWFueSBjZWxscyBwZXIgdHlwZSBwZXIgcGxhdGUgLi4uPyIpCnRhYmxlKHNjUk5Bc2VxRGF0YUBtZXRhLmRhdGEkU0NUX3Nubl9yZXMuMC44LCBzY1JOQXNlcURhdGFAbWV0YS5kYXRhJElEKQoKY2F0KCJcblxuSG93IG1hbnkgY2VsbHMgcGVyIHBhdGllbnQgLi4uPyIpCnNvcnQodGFibGUoc2NSTkFzZXFEYXRhQG1ldGEuZGF0YSRQYXRpZW50KSkKCmNhdCgiXG5cblZpc3VhbGl6aW5nIHRoZXNlIHJhdGlvJ3MgcGVyIHN0dWR5IG51bWJlciBhbmQgc2FtcGxlIC4uLj8iKQpVTUFQUGxvdChzY1JOQXNlcURhdGEsIGxhYmVsID0gVFJVRSwgcHQuc2l6ZSA9IDEuMjUsIGxhYmVsLnNpemUgPSA0LCBncm91cC5ieSA9ICJpZGVudCIsCiAgICAgICAgIHJlcGVsID0gVFJVRSkKZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5VTUFQLnBuZyIpLCBwbG90ID0gbGFzdF9wbG90KCkpCmdnc2F2ZShwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuVU1BUC5wcyIpLCBwbG90ID0gbGFzdF9wbG90KCkpCgoKYmFycGxvdChwcm9wLnRhYmxlKHggPSB0YWJsZShzY1JOQXNlcURhdGFAYWN0aXZlLmlkZW50LCBzY1JOQXNlcURhdGFAbWV0YS5kYXRhJFBhdGllbnQpKSwgCiAgICAgICAgY2V4LmF4aXMgPSAxLjAsIGNleC5uYW1lcyA9IDAuNSwgbGFzID0gMSwKICAgICAgICBjb2wgPSB1aXRob2ZfY29sb3IsIHhsYWIgPSAic3R1ZHkgbnVtYmVyIiwgbGVnZW5kLnRleHQgPSBGQUxTRSwgYXJncy5sZWdlbmQgPSBsaXN0KHggPSAiYm90dG9tIikpCmRldi5jb3B5KHBkZiwgcGFzdGUwKFFDX2xvYywgIi8iLCBUb2RheSwgIi5jZWxsX3JhdGlvc19wZXJfc2FtcGxlLnBkZiIpKQpkZXYub2ZmKCkKCmJhcnBsb3QocHJvcC50YWJsZSh4ID0gdGFibGUoc2NSTkFzZXFEYXRhQGFjdGl2ZS5pZGVudCwgc2NSTkFzZXFEYXRhQG1ldGEuZGF0YSRJRCkpLCAKICAgICAgICBjZXguYXhpcyA9IDEuMCwgY2V4Lm5hbWVzID0gMC41LCBsYXMgPSAyLAogICAgICAgIGNvbCA9IHVpdGhvZl9jb2xvciwgeGxhYiA9ICJzYW1wbGUgSUQiLCBsZWdlbmQudGV4dCA9IEZBTFNFLCBhcmdzLmxlZ2VuZCA9IGxpc3QoeCA9ICJib3R0b20iKSkKZGV2LmNvcHkocGRmLCBwYXN0ZTAoUUNfbG9jLCAiLyIsIFRvZGF5LCAiLmNlbGxfcmF0aW9zX3Blcl9zYW1wbGVfcGVyX3BsYXRlLnBkZiIpKQpkZXYub2ZmKCkKCgoKYGBgCgojIyBWaXN1YWxpc2F0aW9ucwoKTGV0J3MgcHJvamVjdCBrbm93biBjZWxsdWxhciBtYXJrZXJzLgoKYGBge3IgVmlzdWFsaXNhdGlvbjogdFNORSBFeHBsb3JhdGlvbn0KClVNQVBQbG90KHNjUk5Bc2VxRGF0YSwgbGFiZWwgPSBGQUxTRSwgcHQuc2l6ZSA9IDEuMjUsIGxhYmVsLnNpemUgPSA0LCBncm91cC5ieSA9ICJpZGVudCIsCiAgICAgICAgIHJlcGVsID0gVFJVRSkKCiMgZW5kb3RoZWxpYWwgY2VsbHMKRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIkNEMzQiKSwgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiKSkKRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIkVETjEiKSwgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiKSkKRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIkVETlJBIiwgIkVETlJCIiksIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIikpCkZlYXR1cmVQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBjKCJDREg1IiwgIlBFQ0FNMSIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQpGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYygiQUNLUjEiKSwgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiKSkKCiMgU01DCkZlYXR1cmVQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBjKCJNWUgxMSIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQpGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYygiTEdBTFMzIiwgIkFDVEEyIiksIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIikpCgojIG1hY3JvcGhhZ2VzCkZlYXR1cmVQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBjKCJDRDE0IiwgIkNENjgiKSwgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiKSkKRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIkNEMzYiKSwgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiKSkKCiMgdC1jZWxscwpGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYygiQ0QzRSIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQpGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYygiQ0Q0IiksIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIikpCiMgRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIkNEOCIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQoKIyBiLWNlbGxzCkZlYXR1cmVQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBjKCJDRDc5QSIpLCBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIpKQoKIyBtYXN0IGNlbGxzCkZlYXR1cmVQbG90KHNjUk5Bc2VxRGF0YSwgZmVhdHVyZXMgPSBjKCJLSVQiKSwgY29scyA9ICBjKCIjRUNFQ0VDIiwgIiNEQjAwM0YiKSkKCiMgTksgY2VsbHMKRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IGMoIk5DQU0xIiksIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIikpCgpgYGAKCiMjIFRhcmdldHMgb2YgaW50ZXJlc3QKCldlIGNoZWNrIHdoZXRoZXIgdGhlIHRhcmdldHMgZ2VuZXMsICpgciB0YXJnZXRfZ2VuZXNgKiwgd2VyZSBzZXF1ZW5jZWQgdXNpbmcgb3VyCm1ldGhvZCAoU1RBUnNlcSkuCgpTZXZlcmFsIGdlbmVzIGFyZSBub3QgcHJlc2VudCBvciBoYXZlIGRpZmZlcmVudCBuYW1lcywgdGhlc2UgYXJlIGxpc3RlZCBoZXJlLAphbmQgd2VyZSBtYW51YWxseSByZW1vdmVkIGZyb20vY2hhbmdlZCBpbiB0aGUgbGlzdC4KCi0gICBDT0wzQSwgbm90IGZvdW5kCi0gICBDT0wyQSwgbm90IGZvdW5kCgojIyMgRXhwcmVzc2lvbiBpbiBjZWxsIGNvbW11bml0aWVzCgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBUYXJnZXRzfQp0YXJnZXRfZ2VuZXNfcm0gPC0gYygiQ09MM0EiLCAiQ09MMkEiKQoKdGVtcCA9IHRhcmdldF9nZW5lc1shdGFyZ2V0X2dlbmVzICVpbiUgdGFyZ2V0X2dlbmVzX3JtXQoKdGFyZ2V0X2dlbmVzX3FjIDwtIGModGVtcCkKCiMgVmxuUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gIkxJTkMwMTYwMCIpCgojIE1ha2UgZGlyZWN0b3J5IGZvciBwbG90cwppZmVsc2UoIWRpci5leGlzdHMoZmlsZS5wYXRoKFBMT1RfbG9jLCAiL1ZsblBsb3RzIikpLCAKICAgICAgIGRpci5jcmVhdGUoZmlsZS5wYXRoKFBMT1RfbG9jLCAiL1ZsblBsb3RzIikpLCAKICAgICAgIEZBTFNFKQpWTE5fbG9jID0gcGFzdGUwKFBMT1RfbG9jLCIvVmxuUGxvdHMiKQoKIyBNYWtlIGRpcmVjdG9yeSBmb3IgcGxvdHMKaWZlbHNlKCFkaXIuZXhpc3RzKGZpbGUucGF0aChQTE9UX2xvYywgIi9Eb3RQbG90cyIpKSwgCiAgICAgICBkaXIuY3JlYXRlKGZpbGUucGF0aChQTE9UX2xvYywgIi9Eb3RQbG90cyIpKSwgCiAgICAgICBGQUxTRSkKRE9UX2xvYyA9IHBhc3RlMChQTE9UX2xvYywiL0RvdFBsb3RzIikKCiMgTWFrZSBkaXJlY3RvcnkgZm9yIHBsb3RzCmlmZWxzZSghZGlyLmV4aXN0cyhmaWxlLnBhdGgoUExPVF9sb2MsICIvRmVhdHVyZVBsb3RzIikpLCAKICAgICAgIGRpci5jcmVhdGUoZmlsZS5wYXRoKFBMT1RfbG9jLCAiL0ZlYXR1cmVQbG90cyIpKSwgCiAgICAgICBGQUxTRSkKRkVBVF9sb2MgPSBwYXN0ZTAoUExPVF9sb2MsIi9GZWF0dXJlUGxvdHMiKQoKCmZvciAoR0VORSBpbiB0YXJnZXRfZ2VuZXNfcWMpewogIHByaW50KHBhc3RlMCgiUHJvamVjdGluZyB0aGUgZXhwcmVzc2lvbiBvZiAiLCBHRU5FLCAiLiIpKQoKICB2cDEgPC0gIFZsblBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IEdFTkUpICsgCiAgICB4bGFiKCJjZWxsIGNvbW11bml0aWVzIikgKyAKICAgIHlsYWIoYnF1b3RlKCJub3JtYWxpemVkIGV4cHJlc3Npb24iKSkgKwogICAgdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiMwMDAwMDAiLCBzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpLCAKICAgICAgICAgICAgYXhpcy50aXRsZS55ID0gZWxlbWVudF90ZXh0KGNvbG9yID0gIiMwMDAwMDAiLCBzaXplID0gMTQsIGZhY2UgPSAiYm9sZCIpLCAKICAgICAgICAgICAgbGVnZW5kLnBvc2l0aW9uID0gIm5vbmUiKQogICAgZ2dzYXZlKHBhc3RlMChWTE5fbG9jLCAiLyIsIFRvZGF5LCAiLlZsblBsb3QuIixHRU5FLCIucG5nIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKICAgIGdnc2F2ZShwYXN0ZTAoVkxOX2xvYywgIi8iLCBUb2RheSwgIi5WbG5QbG90LiIsR0VORSwiLnBzIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKICAKICBwcmludCh2cDEpCiAgCn0KCgpsaWJyYXJ5KFJDb2xvckJyZXdlcikKCnAxIDwtIERvdFBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IHRhcmdldF9nZW5lc19xYywKICAgICAgICBjb2xzID0gIlJkQnUiKQoKcDEgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDQ1LCBoanVzdD0xLCBzaXplID0gNSkpCgpnZ3NhdmUocGFzdGUwKERPVF9sb2MsICIvIiwgVG9kYXksICIuRG90UGxvdC5UYXJnZXRzLnBuZyIpLCBwbG90ID0gbGFzdF9wbG90KCkpCmdnc2F2ZShwYXN0ZTAoRE9UX2xvYywgIi8iLCBUb2RheSwgIi5Eb3RQbG90LlRhcmdldHMucHMiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKcm0ocDEpCgpGZWF0dXJlUGxvdChzY1JOQXNlcURhdGEsIGZlYXR1cmVzID0gYyh0YXJnZXRfZ2VuZXNfcWMpLAogICAgICAgICAgICBjb2xzID0gIGMoIiNFQ0VDRUMiLCAiI0RCMDAzRiIsICIjOUEzNDgwIiwiIzEyOTBEOSIpLAogICAgICAgICAgICBjb21iaW5lID0gVFJVRSkKCmdnc2F2ZShwYXN0ZTAoRkVBVF9sb2MsICIvIiwgVG9kYXksICIuRmVhdHVyZVBsb3QuVGFyZ2V0cy5wbmciKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQpnZ3NhdmUocGFzdGUwKEZFQVRfbG9jLCAiLyIsIFRvZGF5LCAiLkZlYXR1cmVQbG90LlRhcmdldHMucHMiKSwgcGxvdCA9IGxhc3RfcGxvdCgpKQoKZm9yIChHRU5FIGluIHRhcmdldF9nZW5lc19xYyl7CiAgcHJpbnQocGFzdGUwKCJQcm9qZWN0aW5nIHRoZSBleHByZXNzaW9uIG9mICIsIEdFTkUsICIuIikpCgogIGZwMSA8LSAgRmVhdHVyZVBsb3Qoc2NSTkFzZXFEYXRhLCBmZWF0dXJlcyA9IEdFTkUsIGNvbHMgPSAgYygiI0VDRUNFQyIsICIjREIwMDNGIiwgIiM5QTM0ODAiLCIjMTI5MEQ5IiksCiAgICAgICAgICAgIGNvbWJpbmUgPSBUUlVFKSArIAogICAgeGxhYigiY2VsbCBjb21tdW5pdGllcyIpICsgCiAgICB5bGFiKGJxdW90ZSgibm9ybWFsaXplZCBleHByZXNzaW9uIikpICsKICAgIHRoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSwgCiAgICAgICAgICAgIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfdGV4dChjb2xvciA9ICIjMDAwMDAwIiwgc2l6ZSA9IDE0LCBmYWNlID0gImJvbGQiKSwgCiAgICAgICAgICAgIGxlZ2VuZC5wb3NpdGlvbiA9ICJyaWdodCIpCiAgICBnZ3NhdmUocGFzdGUwKEZFQVRfbG9jLCAiLyIsIFRvZGF5LCAiLkZlYXR1cmVQbG90LiIsR0VORSwiLnBuZyIpLCBwbG90ID0gbGFzdF9wbG90KCkpCiAgICBnZ3NhdmUocGFzdGUwKEZFQVRfbG9jLCAiLyIsIFRvZGF5LCAiLkZlYXR1cmVQbG90LiIsR0VORSwiLnBzIiksIHBsb3QgPSBsYXN0X3Bsb3QoKSkKICAKICBwcmludChmcDEpCiAgCn0KCmBgYAoKIyMjIERpZmZlcmVudGlhbCBleHByZXNzaW9uIGJldHdlZW4gY2VsbCBjb21tdW5pdGllcwoKSGVyZSB3ZSBwcm9qZWN0IGdlbmVzIHRvIG9ubHkgdGhlIGJyb2FkIGNlbGwgY29tbXVuaXRpZXM6CgotICAgbWFjcm9waGFnZXMKLSAgIGVuZG90aGVsaWFsIGNlbGxzCi0gICBzbW9vdGggbXVzY2xlIGNlbGxzCi0gICBULWNlbGxzCi0gICBCLWNlbGxzCi0gICBNYXN0IGNlbGxzCi0gICBOSy1jZWxscwotICAgTWl4ZWQgY2VsbHMKCiMjIyMgTWFjcm9waGFnZXMKCkNvbXBhcmlzb24gYmV0d2VlbiB0aGUgbWFjcm9waGFnZXMgY2VsbCBjb21tdW5pdGllcyAoKkNEMTQvQ0Q2OCo8c3VwPis8L3N1cD4pLAphbmQgYWxsIG90aGVyIGNvbW11bml0aWVzLgoKYGBge3IgVmlzdWFsaXNhdGlvbjogVm9sY2FubyBNQUN9CgpNQUMubWFya2VycyA8LSBGaW5kTWFya2VycyhvYmplY3QgPSBzY1JOQXNlcURhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjEgPSBjKCJDRDE0K0NENjgrIE0gSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDE0K0NENjgrIE0gSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QxNCtDRDY4KyBNIElJSSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4yID0gYygjIkNEMTQrQ0Q2OCsgTSBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyJDRDE0K0NENjgrIE0gSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIkNEMTQrQ0Q2OCsgTSBJSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4KyBUIEkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4QSsgVCBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4QSsgVCBJSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENCsgVCBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDQrIFQgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzIFRyZWdzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMzQrIEVDIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzNCsgRUMgSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXhlZCBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1peGVkIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFDVEEyKyBTTUMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTkNBTTErIE5LIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktJVCsgTUMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDc5QSsgQiBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENzlBKyBCIElJIikpCgpEVDo6ZGF0YXRhYmxlKE1BQy5tYXJrZXJzKQoKTUFDX1ZvbGNhbm9fVGFyZ2V0c0EgPSBFbmhhbmNlZFZvbGNhbm8oTUFDLm1hcmtlcnMsCiAgICBsYWIgPSByb3duYW1lcyhNQUMubWFya2VycyksCiAgICB4ID0gImF2Z19sb2cyRkMiLAogICAgeSA9ICJwX3ZhbF9hZGoiLAogICAgc2VsZWN0TGFiID0gdGFyZ2V0X2dlbmVzX3FjLAogICAgYXhpc0xhYlNpemUgPSAxMiwKICAgIHhsYWIgPSAiYXZlcmFnZSBmb2xkLWNoYW5nZSIsCiAgICB0aXRsZSA9ICJNYWNyb3BoYWdlIG1hcmtlcnNcbihNYWNyb3BoYWdlIGNvbW11bml0aWVzIHZzIHRoZSByZXN0KSIsCiAgICB0aXRsZUxhYlNpemUgPSAxNCwKICAgIHBDdXRvZmYgPSAwLjA1L05fR0VORVMsICMgMjA1NTIgZ2VuZXMKICAgIEZDY3V0b2ZmID0gMS4yNSwKICAgIHBvaW50U2l6ZSA9IDEuNSwKICAgIGxhYlNpemUgPSAzLjAsCiAgICBsZWdlbmRMYWJlbHM9YygnTlMnLCdhdmcuIGZvbGQtY2hhbmdlJywnUCcsCiAgICAgICdQICYgYXZnLiBmb2xkLWNoYW5nZScpLAogICAgbGVnZW5kUG9zaXRpb24gPSAicmlnaHQiLAogICAgbGVnZW5kTGFiU2l6ZSA9IDEwLAogICAgbGVnZW5kSWNvblNpemUgPSAzLjAsCiAgICBkcmF3Q29ubmVjdG9ycyA9IFRSVUUsCiAgICB3aWR0aENvbm5lY3RvcnMgPSAwLjIsCiAgICBjb2xDb25uZWN0b3JzID0gIiM1OTVBNUMiLAogICAgZ3JpZGxpbmVzLm1ham9yID0gRkFMU0UsCiAgICBncmlkbGluZXMubWlub3IgPSBGQUxTRSkKIyBNQUNfVm9sY2Fub19UYXJnZXRzQQpnZ3NhdmUocGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLlZvbGNhbm8uTUFDLkRFRy5UYXJnZXRzLnBkZiIpLCAKICAgICAgIHBsb3QgPSBNQUNfVm9sY2Fub19UYXJnZXRzQSkKCmBgYAoKVGhlIHRhcmdldCByZXN1bHRzIGFyZSBnaXZlbiBiZWxvdyBhbmQgd3JpdHRlbiB0byBhIGZpbGUuCgpgYGB7ciBSZXN1bHRzIE1BQ30KbGlicmFyeSh0aWJibGUpCk1BQy5tYXJrZXJzIDwtIGFkZF9jb2x1bW4oTUFDLm1hcmtlcnMsIEdlbmUgPSByb3cubmFtZXMoTUFDLm1hcmtlcnMpLCAuYmVmb3JlID0gMSkKCnRlbXAgPC0gTUFDLm1hcmtlcnNbTUFDLm1hcmtlcnMkR2VuZSAlaW4lIHRhcmdldF9nZW5lc19xYyxdCgpEVDo6ZGF0YXRhYmxlKHRlbXApCmBgYAoKYGBge3IgUmVzdWx0cyBNQUM6IHdyaXRpbmd9CmZ3cml0ZSh0ZW1wLCBmaWxlID0gcGFzdGUwKE9VVF9sb2MsICIvIiwgVG9kYXksICIuTUFDLkRFRy5UYXJnZXRzLnR4dCIpLAogICAgICAgcXVvdGUgPSBGQUxTRSwKICAgICAgIHNlcCA9ICJcdCIsIAogICAgICAgc2hvd1Byb2dyZXNzID0gRkFMU0UsIHZlcmJvc2UgPSBGQUxTRSkKYGBgCgojIyMjIFNtb290aCBtdXNjbGUgY2VsbHMKCkNvbXBhcmlzb24gYmV0d2VlbiB0aGUgc21vb3RoIG11c2NsZSBjZWxsIGNvbW11bml0aWVzICgqQUNUQTIqPHN1cD4rPC9zdXA+KSwgYW5kCmFsbCBvdGhlciBjb21tdW5pdGllcy4KCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gU01DfQoKU01DLm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gc2NSTkFzZXFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gYygiQUNUQTIrIFNNQyIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4yID0gYygiQ0QxNCtDRDY4KyBNIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QxNCtDRDY4KyBNIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMTQrQ0Q2OCsgTSBJSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4KyBUIEkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4QSsgVCBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4QSsgVCBJSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENCsgVCBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDQrIFQgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzIFRyZWdzIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMzQrIEVDIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzNCsgRUMgSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXhlZCBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1peGVkIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAiQUNUQTIrIFNNQyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJOQ0FNMSsgTksiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiS0lUKyBNQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENzlBKyBCIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OUErIEIgSUkiKSkKCkRUOjpkYXRhdGFibGUoU01DLm1hcmtlcnMpCgpTTUNfVm9sY2Fub19UYXJnZXRzQSA9IEVuaGFuY2VkVm9sY2FubyhTTUMubWFya2VycywKICAgIGxhYiA9IHJvd25hbWVzKFNNQy5tYXJrZXJzKSwKICAgIHggPSAiYXZnX2xvZzJGQyIsCiAgICB5ID0gInBfdmFsX2FkaiIsCiAgICBzZWxlY3RMYWIgPSB0YXJnZXRfZ2VuZXNfcWMsCiAgICBheGlzTGFiU2l6ZSA9IDEyLAogICAgeGxhYiA9ICJhdmVyYWdlIGZvbGQtY2hhbmdlIiwKICAgIHRpdGxlID0gIlNNQyBtYXJrZXJzXG4oU01DIGNvbW11bml0aWVzIHZzIHRoZSByZXN0KSIsCiAgICB0aXRsZUxhYlNpemUgPSAxNCwKICAgIHBDdXRvZmYgPSAwLjA1L05fR0VORVMsICMgMjA1NTIgZ2VuZXMKICAgIEZDY3V0b2ZmID0gMS4yNSwKICAgIHBvaW50U2l6ZSA9IDEuNSwKICAgIGxhYlNpemUgPSAzLjAsCiAgICBsZWdlbmRMYWJlbHM9YygnTlMnLCdhdmcuIGZvbGQtY2hhbmdlJywnUCcsCiAgICAgICdQICYgYXZnLiBmb2xkLWNoYW5nZScpLAogICAgbGVnZW5kUG9zaXRpb24gPSAicmlnaHQiLAogICAgbGVnZW5kTGFiU2l6ZSA9IDEwLAogICAgbGVnZW5kSWNvblNpemUgPSAzLjAsCiAgICBkcmF3Q29ubmVjdG9ycyA9IFRSVUUsCiAgICB3aWR0aENvbm5lY3RvcnMgPSAwLjIsCiAgICBjb2xDb25uZWN0b3JzID0gIiM1OTVBNUMiLAogICAgZ3JpZGxpbmVzLm1ham9yID0gRkFMU0UsCiAgICBncmlkbGluZXMubWlub3IgPSBGQUxTRSkKIyBTTUNfVm9sY2Fub19UYXJnZXRzQQpnZ3NhdmUocGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLlZvbGNhbm8uU01DLkRFRy5UYXJnZXRzLnBkZiIpLCAKICAgICAgIHBsb3QgPSBTTUNfVm9sY2Fub19UYXJnZXRzQSkKYGBgCgpUaGUgdGFyZ2V0IHJlc3VsdHMgYXJlIGdpdmVuIGJlbG93IGFuZCB3cml0dGVuIHRvIGEgZmlsZS4KCmBgYHtyIFJlc3VsdHMgU01DfQpsaWJyYXJ5KHRpYmJsZSkKU01DLm1hcmtlcnMgPC0gYWRkX2NvbHVtbihTTUMubWFya2VycywgR2VuZSA9IHJvdy5uYW1lcyhTTUMubWFya2VycyksIC5iZWZvcmUgPSAxKQoKdGVtcCA8LSBTTUMubWFya2Vyc1tTTUMubWFya2VycyRHZW5lICVpbiUgdGFyZ2V0X2dlbmVzX3FjLF0KCkRUOjpkYXRhdGFibGUodGVtcCkKYGBgCgpgYGB7ciBSZXN1bHRzIFNNQzogd3JpdGluZ30KZndyaXRlKHRlbXAsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLCBUb2RheSwgIi5TTUMuREVHLlRhcmdldHMudHh0IiksCiAgICAgICBxdW90ZSA9IEZBTFNFLAogICAgICAgc2VwID0gIlx0IiwgCiAgICAgICBzaG93UHJvZ3Jlc3MgPSBGQUxTRSwgdmVyYm9zZSA9IEZBTFNFKQpgYGAKCiMjIyMgRW5kb3RoZWxpYWwgY2VsbHMKCkNvbXBhcmlzb24gYmV0d2VlbiB0aGUgZW5kb3RoZWxpYWwgY2VsbCBjb21tdW5pdGllcyAoKkNEMzQqPHN1cD4rPC9zdXA+KSwgYW5kCmFsbCBvdGhlciBjb21tdW5pdGllcy4KCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gRUN9CgpFQy5tYXJrZXJzIDwtIEZpbmRNYXJrZXJzKG9iamVjdCA9IHNjUk5Bc2VxRGF0YSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMSA9IGMoIkNEMzQrIEVDIEkiLCAiQ0QzNCsgRUMgSUkiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMiA9IGMoIkNEMTQrQ0Q2OCsgTSBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMTQrQ0Q2OCsgTSBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDE0K0NENjgrIE0gSUlJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NEOCsgVCBJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NEOEErIFQgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NEOEErIFQgSUlJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDQrIFQgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q0KyBUIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMyBUcmVncyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAiQ0QzNCsgRUMgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIkNEMzQrIEVDIElJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWl4ZWQgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXhlZCBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBQ1RBMisgU01DIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTkNBTTErIE5LIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktJVCsgTUMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDc5QSsgQiBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENzlBKyBCIElJIikpCgpEVDo6ZGF0YXRhYmxlKEVDLm1hcmtlcnMpCgpFQ19Wb2xjYW5vX1RhcmdldHNBID0gRW5oYW5jZWRWb2xjYW5vKEVDLm1hcmtlcnMsCiAgICBsYWIgPSByb3duYW1lcyhFQy5tYXJrZXJzKSwKICAgIHggPSAiYXZnX2xvZzJGQyIsCiAgICB5ID0gInBfdmFsX2FkaiIsCiAgICBzZWxlY3RMYWIgPSB0YXJnZXRfZ2VuZXNfcWMsCiAgICBheGlzTGFiU2l6ZSA9IDEyLAogICAgeGxhYiA9ICJhdmVyYWdlIGZvbGQtY2hhbmdlIiwKICAgIHRpdGxlID0gIkVuZG90aGVsaWFsIGNlbGwgbWFya2Vyc1xuKEVDIGNvbW11bml0aWVzIHZzIHRoZSByZXN0KSIsCiAgICB0aXRsZUxhYlNpemUgPSAxNCwKICAgIHBDdXRvZmYgPSAwLjA1L05fR0VORVMsICMgMjA1NTIgZ2VuZXMKICAgIEZDY3V0b2ZmID0gMS4yNSwKICAgIHBvaW50U2l6ZSA9IDEuNSwKICAgIGxhYlNpemUgPSAzLjAsCiAgICBsZWdlbmRMYWJlbHM9YygnTlMnLCdhdmcuIGZvbGQtY2hhbmdlJywnUCcsCiAgICAgICdQICYgYXZnLiBmb2xkLWNoYW5nZScpLAogICAgbGVnZW5kUG9zaXRpb24gPSAicmlnaHQiLAogICAgbGVnZW5kTGFiU2l6ZSA9IDEwLAogICAgbGVnZW5kSWNvblNpemUgPSAzLjAsCiAgICBkcmF3Q29ubmVjdG9ycyA9IFRSVUUsCiAgICB3aWR0aENvbm5lY3RvcnMgPSAwLjIsCiAgICBjb2xDb25uZWN0b3JzID0gIiM1OTVBNUMiLAogICAgZ3JpZGxpbmVzLm1ham9yID0gRkFMU0UsCiAgICBncmlkbGluZXMubWlub3IgPSBGQUxTRSkKIyBFQ19Wb2xjYW5vX1RhcmdldHNBCmdnc2F2ZShwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuVm9sY2Fuby5FQy5ERUcuVGFyZ2V0cy5wZGYiKSwgCiAgICAgICBwbG90ID0gRUNfVm9sY2Fub19UYXJnZXRzQSkKYGBgCgpUaGUgdGFyZ2V0IHJlc3VsdHMgYXJlIGdpdmVuIGJlbG93IGFuZCB3cml0dGVuIHRvIGEgZmlsZS4KCmBgYHtyIFJlc3VsdHMgRUN9CmxpYnJhcnkodGliYmxlKQpFQy5tYXJrZXJzIDwtIGFkZF9jb2x1bW4oRUMubWFya2VycywgR2VuZSA9IHJvdy5uYW1lcyhFQy5tYXJrZXJzKSwgLmJlZm9yZSA9IDEpCgp0ZW1wIDwtIEVDLm1hcmtlcnNbRUMubWFya2VycyRHZW5lICVpbiUgdGFyZ2V0X2dlbmVzX3FjLF0KCkRUOjpkYXRhdGFibGUodGVtcCkKYGBgCgpgYGB7ciBSZXN1bHRzIEVDOiB3cml0aW5nfQpmd3JpdGUodGVtcCwgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsIFRvZGF5LCAiLkVDLkRFRy5UYXJnZXRzLnR4dCIpLAogICAgICAgcXVvdGUgPSBGQUxTRSwKICAgICAgIHNlcCA9ICJcdCIsIAogICAgICAgc2hvd1Byb2dyZXNzID0gRkFMU0UsIHZlcmJvc2UgPSBGQUxTRSkKYGBgCgojIyMjIFQtY2VsbHMKCkNvbXBhcmlzb24gYmV0d2VlbiB0aGUgVC1jZWxsIGNvbW11bml0aWVzICgqQ0QzL0NENC9DRDgqPHN1cD4rPC9zdXA+KSwgYW5kIGFsbApvdGhlciBjb21tdW5pdGllcy4KCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gVGNlbGx9CgpUQy5tYXJrZXJzIDwtIEZpbmRNYXJrZXJzKG9iamVjdCA9IHNjUk5Bc2VxRGF0YSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMSA9IGMoIkNEMytDRDgrIFQgSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDhBKyBUIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDhBKyBUIElJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q0KyBUIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENCsgVCBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMgVHJlZ3MiKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnQuMiA9IGMoIkNEMTQrQ0Q2OCsgTSBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMTQrQ0Q2OCsgTSBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDE0K0NENjgrIE0gSUlJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJDRDMrQ0Q4KyBUIEkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIkNEMytDRDhBKyBUIElJICIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIkNEMytDRDhBKyBUIElJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIkNEMytDRDQrIFQgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIkNEMytDRDQrIFQgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICJDRDMgVHJlZ3MiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzNCsgRUMgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDM0KyBFQyBJSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1peGVkIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWl4ZWQgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUNUQTIrIFNNQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5DQU0xKyBOSyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLSVQrIE1DIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OUErIEIgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDc5QSsgQiBJSSIpKQoKRFQ6OmRhdGF0YWJsZShUQy5tYXJrZXJzKQoKVENfVm9sY2Fub19UYXJnZXRzQSA9IEVuaGFuY2VkVm9sY2FubyhUQy5tYXJrZXJzLAogICAgbGFiID0gcm93bmFtZXMoVEMubWFya2VycyksCiAgICB4ID0gImF2Z19sb2cyRkMiLAogICAgeSA9ICJwX3ZhbF9hZGoiLAogICAgc2VsZWN0TGFiID0gdGFyZ2V0X2dlbmVzX3FjLAogICAgYXhpc0xhYlNpemUgPSAxMiwKICAgIHhsYWIgPSAiYXZlcmFnZSBmb2xkLWNoYW5nZSIsCiAgICB0aXRsZSA9ICJULWNlbGwgbWFya2Vyc1xuKFQtY2VsbCBjb21tdW5pdGllcyB2cyB0aGUgcmVzdCkiLAogICAgdGl0bGVMYWJTaXplID0gMTQsCiAgICBwQ3V0b2ZmID0gMC4wNS9OX0dFTkVTLCAjIDIwNTUyIGdlbmVzCiAgICBGQ2N1dG9mZiA9IDEuMjUsCiAgICBwb2ludFNpemUgPSAxLjUsCiAgICBsYWJTaXplID0gMy4wLAogICAgbGVnZW5kTGFiZWxzPWMoJ05TJywnYXZnLiBmb2xkLWNoYW5nZScsJ1AnLAogICAgICAnUCAmIGF2Zy4gZm9sZC1jaGFuZ2UnKSwKICAgIGxlZ2VuZFBvc2l0aW9uID0gInJpZ2h0IiwKICAgIGxlZ2VuZExhYlNpemUgPSAxMCwKICAgIGxlZ2VuZEljb25TaXplID0gMy4wLAogICAgZHJhd0Nvbm5lY3RvcnMgPSBUUlVFLAogICAgd2lkdGhDb25uZWN0b3JzID0gMC4yLAogICAgY29sQ29ubmVjdG9ycyA9ICIjNTk1QTVDIiwKICAgIGdyaWRsaW5lcy5tYWpvciA9IEZBTFNFLAogICAgZ3JpZGxpbmVzLm1pbm9yID0gRkFMU0UpCiMgVENfVm9sY2Fub19UYXJnZXRzQQpnZ3NhdmUocGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLlZvbGNhbm8uVEMuREVHLlRhcmdldHMucGRmIiksIAogICAgICAgcGxvdCA9IFRDX1ZvbGNhbm9fVGFyZ2V0c0EpCmBgYAoKVGhlIHRhcmdldCByZXN1bHRzIGFyZSBnaXZlbiBiZWxvdyBhbmQgd3JpdHRlbiB0byBhIGZpbGUuCgpgYGB7ciBSZXN1bHRzIFRDfQpsaWJyYXJ5KHRpYmJsZSkKVEMubWFya2VycyA8LSBhZGRfY29sdW1uKFRDLm1hcmtlcnMsIEdlbmUgPSByb3cubmFtZXMoVEMubWFya2VycyksIC5iZWZvcmUgPSAxKQoKdGVtcCA8LSBUQy5tYXJrZXJzW1RDLm1hcmtlcnMkR2VuZSAlaW4lIHRhcmdldF9nZW5lc19xYyxdCgpEVDo6ZGF0YXRhYmxlKHRlbXApCmBgYAoKYGBge3IgUmVzdWx0cyBUQzogd3JpdGluZ30KZndyaXRlKHRlbXAsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLCBUb2RheSwgIi5UQy5ERUcuVGFyZ2V0cy50eHQiKSwKICAgICAgIHF1b3RlID0gRkFMU0UsCiAgICAgICBzZXAgPSAiXHQiLCAKICAgICAgIHNob3dQcm9ncmVzcyA9IEZBTFNFLCB2ZXJib3NlID0gRkFMU0UpCmBgYAoKIyMjIyBCLWNlbGxzCgpDb21wYXJpc29uIGJldHdlZW4gdGhlIEItY2VsbCBjb21tdW5pdGllcyAoKkNENzlBKjxzdXA+Kzwvc3VwPiksIGFuZCBhbGwgb3RoZXIKY29tbXVuaXRpZXMuCgpgYGB7ciBWaXN1YWxpc2F0aW9uOiBWb2xjYW5vIEJjZWxsfQoKQkMubWFya2VycyA8LSBGaW5kTWFya2VycyhvYmplY3QgPSBzY1JOQXNlcURhdGEsIAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjEgPSBjKCJDRDc5QSsgQiBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENzlBKyBCIElJIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjIgPSBjKCJDRDE0K0NENjgrIE0gSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDE0K0NENjgrIE0gSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QxNCtDRDY4KyBNIElJSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDgrIFQgSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDhBKyBUIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDhBKyBUIElJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q0KyBUIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENCsgVCBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMgVHJlZ3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDM0KyBFQyBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMzQrIEVDIElJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWl4ZWQgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXhlZCBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJBQ1RBMisgU01DIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTkNBTTErIE5LIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktJVCsgTUMiKSkKCkRUOjpkYXRhdGFibGUoQkMubWFya2VycykKCkJDX1ZvbGNhbm9fVGFyZ2V0c0EgPSBFbmhhbmNlZFZvbGNhbm8oQkMubWFya2VycywKICAgIGxhYiA9IHJvd25hbWVzKEJDLm1hcmtlcnMpLAogICAgeCA9ICJhdmdfbG9nMkZDIiwKICAgIHkgPSAicF92YWxfYWRqIiwKICAgIHNlbGVjdExhYiA9IHRhcmdldF9nZW5lc19xYywKICAgIGF4aXNMYWJTaXplID0gMTIsCiAgICB4bGFiID0gImF2ZXJhZ2UgZm9sZC1jaGFuZ2UiLAogICAgdGl0bGUgPSAiQi1jZWxsIG1hcmtlcnNcbihCLWNlbGwgY29tbXVuaXRpZXMgdnMgdGhlIHJlc3QpIiwKICAgIHRpdGxlTGFiU2l6ZSA9IDE0LAogICAgcEN1dG9mZiA9IDAuMDUvTl9HRU5FUywgIyAyMDU1MiBnZW5lcwogICAgRkNjdXRvZmYgPSAxLjI1LAogICAgcG9pbnRTaXplID0gMS41LAogICAgbGFiU2l6ZSA9IDMuMCwKICAgIGxlZ2VuZExhYmVscz1jKCdOUycsJ2F2Zy4gZm9sZC1jaGFuZ2UnLCdQJywKICAgICAgJ1AgJiBhdmcuIGZvbGQtY2hhbmdlJyksCiAgICBsZWdlbmRQb3NpdGlvbiA9ICJyaWdodCIsCiAgICBsZWdlbmRMYWJTaXplID0gMTAsCiAgICBsZWdlbmRJY29uU2l6ZSA9IDMuMCwKICAgIGRyYXdDb25uZWN0b3JzID0gVFJVRSwKICAgIHdpZHRoQ29ubmVjdG9ycyA9IDAuMiwKICAgIGNvbENvbm5lY3RvcnMgPSAiIzU5NUE1QyIsCiAgICBncmlkbGluZXMubWFqb3IgPSBGQUxTRSwKICAgIGdyaWRsaW5lcy5taW5vciA9IEZBTFNFKQojIEJDX1ZvbGNhbm9fVGFyZ2V0c0EKZ2dzYXZlKHBhc3RlMChQTE9UX2xvYywgIi8iLCBUb2RheSwgIi5Wb2xjYW5vLkJDLkRFRy5UYXJnZXRzLnBkZiIpLCAKICAgICAgIHBsb3QgPSBCQ19Wb2xjYW5vX1RhcmdldHNBKQpgYGAKClRoZSB0YXJnZXQgcmVzdWx0cyBhcmUgZ2l2ZW4gYmVsb3cgYW5kIHdyaXR0ZW4gdG8gYSBmaWxlLgoKYGBge3IgUmVzdWx0cyBCQ30KbGlicmFyeSh0aWJibGUpCkJDLm1hcmtlcnMgPC0gYWRkX2NvbHVtbihCQy5tYXJrZXJzLCBHZW5lID0gcm93Lm5hbWVzKEJDLm1hcmtlcnMpLCAuYmVmb3JlID0gMSkKCnRlbXAgPC0gQkMubWFya2Vyc1tCQy5tYXJrZXJzJEdlbmUgJWluJSB0YXJnZXRfZ2VuZXNfcWMsXQoKRFQ6OmRhdGF0YWJsZSh0ZW1wKQpgYGAKCmBgYHtyIFJlc3VsdHMgQkM6IHdyaXRpbmd9CmZ3cml0ZSh0ZW1wLCBmaWxlID0gcGFzdGUwKE9VVF9sb2MsICIvIiwgVG9kYXksICIuQkMuREVHLlRhcmdldHMudHh0IiksCiAgICAgICBxdW90ZSA9IEZBTFNFLAogICAgICAgc2VwID0gIlx0IiwgCiAgICAgICBzaG93UHJvZ3Jlc3MgPSBGQUxTRSwgdmVyYm9zZSA9IEZBTFNFKQpgYGAKCiMjIyMgTWFzdCBjZWxscwoKQ29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBtYXN0IGNlbGwgY29tbXVuaXRpZXMgKCpLSVQqPHN1cD4rPC9zdXA+KSwgYW5kIGFsbCBvdGhlcgpjb21tdW5pdGllcy4KCmBgYHtyIFZpc3VhbGlzYXRpb246IFZvbGNhbm8gTWFzdH0KCk1DLm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gc2NSTkFzZXFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gYygiS0lUKyBNQyIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4yID0gYygiQ0QxNCtDRDY4KyBNIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QxNCtDRDY4KyBNIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMTQrQ0Q2OCsgTSBJSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4KyBUIEkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4QSsgVCBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4QSsgVCBJSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENCsgVCBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDQrIFQgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzIFRyZWdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzNCsgRUMgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDM0KyBFQyBJSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1peGVkIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWl4ZWQgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUNUQTIrIFNNQyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk5DQU0xKyBOSyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIktJVCsgTUMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDc5QSsgQiBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENzlBKyBCIElJIikpCgpEVDo6ZGF0YXRhYmxlKE1DLm1hcmtlcnMpCgpNQ19Wb2xjYW5vX1RhcmdldHNBID0gRW5oYW5jZWRWb2xjYW5vKE1DLm1hcmtlcnMsCiAgICBsYWIgPSByb3duYW1lcyhNQy5tYXJrZXJzKSwKICAgIHggPSAiYXZnX2xvZzJGQyIsCiAgICB5ID0gInBfdmFsX2FkaiIsCiAgICBzZWxlY3RMYWIgPSB0YXJnZXRfZ2VuZXNfcWMsCiAgICBheGlzTGFiU2l6ZSA9IDEyLAogICAgeGxhYiA9ICJhdmVyYWdlIGZvbGQtY2hhbmdlIiwKICAgIHRpdGxlID0gIk1hc3QgY2VsbCBtYXJrZXJzXG4oTWFzdCBjZWxsIGNvbW11bml0aWVzIHZzIHRoZSByZXN0KSIsCiAgICB0aXRsZUxhYlNpemUgPSAxNCwKICAgIHBDdXRvZmYgPSAwLjA1L05fR0VORVMsICMgMjA1NTIgZ2VuZXMKICAgIEZDY3V0b2ZmID0gMS4yNSwKICAgIHBvaW50U2l6ZSA9IDEuNSwKICAgIGxhYlNpemUgPSAzLjAsCiAgICBsZWdlbmRMYWJlbHM9YygnTlMnLCdhdmcuIGZvbGQtY2hhbmdlJywnUCcsCiAgICAgICdQICYgYXZnLiBmb2xkLWNoYW5nZScpLAogICAgbGVnZW5kUG9zaXRpb24gPSAicmlnaHQiLAogICAgbGVnZW5kTGFiU2l6ZSA9IDEwLAogICAgbGVnZW5kSWNvblNpemUgPSAzLjAsCiAgICBkcmF3Q29ubmVjdG9ycyA9IFRSVUUsCiAgICB3aWR0aENvbm5lY3RvcnMgPSAwLjIsCiAgICBjb2xDb25uZWN0b3JzID0gIiM1OTVBNUMiLAogICAgZ3JpZGxpbmVzLm1ham9yID0gRkFMU0UsCiAgICBncmlkbGluZXMubWlub3IgPSBGQUxTRSkKIyBNQ19Wb2xjYW5vX1RhcmdldHNBCmdnc2F2ZShwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuVm9sY2Fuby5NQy5ERUcuVGFyZ2V0cy5wZGYiKSwgCiAgICAgICBwbG90ID0gTUNfVm9sY2Fub19UYXJnZXRzQSkKYGBgCgpUaGUgdGFyZ2V0IHJlc3VsdHMgYXJlIGdpdmVuIGJlbG93IGFuZCB3cml0dGVuIHRvIGEgZmlsZS4KCmBgYHtyIFJlc3VsdHMgTUN9CmxpYnJhcnkodGliYmxlKQpNQy5tYXJrZXJzIDwtIGFkZF9jb2x1bW4oTUMubWFya2VycywgR2VuZSA9IHJvdy5uYW1lcyhNQy5tYXJrZXJzKSwgLmJlZm9yZSA9IDEpCgp0ZW1wIDwtIE1DLm1hcmtlcnNbTUMubWFya2VycyRHZW5lICVpbiUgdGFyZ2V0X2dlbmVzX3FjLF0KCkRUOjpkYXRhdGFibGUodGVtcCkKYGBgCgpgYGB7ciBSZXN1bHRzIE1DOiB3cml0aW5nfQpmd3JpdGUodGVtcCwgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsIFRvZGF5LCAiLk1DLkRFRy5UYXJnZXRzLnR4dCIpLAogICAgICAgcXVvdGUgPSBGQUxTRSwKICAgICAgIHNlcCA9ICJcdCIsIAogICAgICAgc2hvd1Byb2dyZXNzID0gRkFMU0UsIHZlcmJvc2UgPSBGQUxTRSkKYGBgCgojIyMjIE5LLWNlbGxzCgpDb21wYXJpc29uIGJldHdlZW4gdGhlIG5hdHVyYWwga2lsbGVyIGNlbGwgY29tbXVuaXRpZXMgKCpOQ0FNMSo8c3VwPis8L3N1cD4pLAphbmQgYWxsIG90aGVyIGNvbW11bml0aWVzLgoKYGBge3IgVmlzdWFsaXNhdGlvbjogVm9sY2FubyBOS30KCk5LLm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gc2NSTkFzZXFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gYygiTkNBTTErIE5LIiksIAogICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50LjIgPSBjKCJDRDE0K0NENjgrIE0gSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDE0K0NENjgrIE0gSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QxNCtDRDY4KyBNIElJSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDgrIFQgSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDhBKyBUIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDhBKyBUIElJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q0KyBUIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENCsgVCBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMgVHJlZ3MiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDM0KyBFQyBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMzQrIEVDIElJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWl4ZWQgSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1peGVkIElJIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQUNUQTIrIFNNQyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIk5DQU0xKyBOSyIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJLSVQrIE1DIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0Q3OUErIEIgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDc5QSsgQiBJSSIpKQoKRFQ6OmRhdGF0YWJsZShOSy5tYXJrZXJzKQoKTktfVm9sY2Fub19UYXJnZXRzQSA9IEVuaGFuY2VkVm9sY2FubyhOSy5tYXJrZXJzLAogICAgbGFiID0gcm93bmFtZXMoTksubWFya2VycyksCiAgICB4ID0gImF2Z19sb2cyRkMiLAogICAgeSA9ICJwX3ZhbF9hZGoiLAogICAgc2VsZWN0TGFiID0gdGFyZ2V0X2dlbmVzX3FjLAogICAgYXhpc0xhYlNpemUgPSAxMiwKICAgIHhsYWIgPSAiYXZlcmFnZSBmb2xkLWNoYW5nZSIsCiAgICB0aXRsZSA9ICJOSyBtYXJrZXJzXG4oTkstY2VsbCBjb21tdW5pdGllcyB2cyB0aGUgcmVzdCkiLAogICAgdGl0bGVMYWJTaXplID0gMTQsCiAgICBwQ3V0b2ZmID0gMC4wNS9OX0dFTkVTLCAjIDIwNTUyIGdlbmVzCiAgICBGQ2N1dG9mZiA9IDEuMjUsCiAgICBwb2ludFNpemUgPSAxLjUsCiAgICBsYWJTaXplID0gMy4wLAogICAgbGVnZW5kTGFiZWxzPWMoJ05TJywnYXZnLiBmb2xkLWNoYW5nZScsJ1AnLAogICAgICAnUCAmIGF2Zy4gZm9sZC1jaGFuZ2UnKSwKICAgIGxlZ2VuZFBvc2l0aW9uID0gInJpZ2h0IiwKICAgIGxlZ2VuZExhYlNpemUgPSAxMCwKICAgIGxlZ2VuZEljb25TaXplID0gMy4wLAogICAgZHJhd0Nvbm5lY3RvcnMgPSBUUlVFLAogICAgd2lkdGhDb25uZWN0b3JzID0gMC4yLAogICAgY29sQ29ubmVjdG9ycyA9ICIjNTk1QTVDIiwKICAgIGdyaWRsaW5lcy5tYWpvciA9IEZBTFNFLAogICAgZ3JpZGxpbmVzLm1pbm9yID0gRkFMU0UpCiMgTktfVm9sY2Fub19UYXJnZXRzQQpnZ3NhdmUocGFzdGUwKFBMT1RfbG9jLCAiLyIsIFRvZGF5LCAiLlZvbGNhbm8uTksuREVHLlRhcmdldHMucGRmIiksIAogICAgICAgcGxvdCA9IE5LX1ZvbGNhbm9fVGFyZ2V0c0EpCmBgYAoKVGhlIHRhcmdldCByZXN1bHRzIGFyZSBnaXZlbiBiZWxvdyBhbmQgd3JpdHRlbiB0byBhIGZpbGUuCgpgYGB7ciBSZXN1bHRzIE5LfQpsaWJyYXJ5KHRpYmJsZSkKTksubWFya2VycyA8LSBhZGRfY29sdW1uKE5LLm1hcmtlcnMsIEdlbmUgPSByb3cubmFtZXMoTksubWFya2VycyksIC5iZWZvcmUgPSAxKQoKdGVtcCA8LSBOSy5tYXJrZXJzW05LLm1hcmtlcnMkR2VuZSAlaW4lIHRhcmdldF9nZW5lc19xYyxdCgpEVDo6ZGF0YXRhYmxlKHRlbXApCmBgYAoKYGBge3IgUmVzdWx0cyBOSzogd3JpdGluZ30KZndyaXRlKHRlbXAsIGZpbGUgPSBwYXN0ZTAoT1VUX2xvYywgIi8iLCBUb2RheSwgIi5OSy5ERUcuVGFyZ2V0cy50eHQiKSwKICAgICAgIHF1b3RlID0gRkFMU0UsCiAgICAgICBzZXAgPSAiXHQiLCAKICAgICAgIHNob3dQcm9ncmVzcyA9IEZBTFNFLCB2ZXJib3NlID0gRkFMU0UpCmBgYAoKIyMjIyBNaXhlZCBjZWxscwoKQ29tcGFyaXNvbiBiZXR3ZWVuIHRoZSBtaXhlZCBjZWxsIGNvbW11bml0aWVzLCBhbmQgYWxsIG90aGVyIGNvbW11bml0aWVzLgoKYGBge3IgVmlzdWFsaXNhdGlvbjogVm9sY2FubyBNSVhFRH0KCk1JWEVELm1hcmtlcnMgPC0gRmluZE1hcmtlcnMob2JqZWN0ID0gc2NSTkFzZXFEYXRhLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4xID0gYygiTWl4ZWQgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNaXhlZCBJSSIpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudC4yID0gYygiQ0QxNCtDRDY4KyBNIEkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QxNCtDRDY4KyBNIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMTQrQ0Q2OCsgTSBJSUkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4KyBUIEkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4QSsgVCBJSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDMrQ0Q4QSsgVCBJSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzK0NENCsgVCBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNEMytDRDQrIFQgSUkiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzIFRyZWdzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ0QzNCsgRUMgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDM0KyBFQyBJSSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAiTWl4ZWQgSSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgIk1peGVkIElJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFDVEEyKyBTTUMiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTkNBTTErIE5LIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIktJVCsgTUMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDRDc5QSsgQiBJIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNENzlBKyBCIElJIikpCgpEVDo6ZGF0YXRhYmxlKE1JWEVELm1hcmtlcnMpCgpNSVhFRF9Wb2xjYW5vX1RhcmdldHNBID0gRW5oYW5jZWRWb2xjYW5vKE1JWEVELm1hcmtlcnMsCiAgICBsYWIgPSByb3duYW1lcyhNSVhFRC5tYXJrZXJzKSwKICAgIHggPSAiYXZnX2xvZzJGQyIsCiAgICB5ID0gInBfdmFsX2FkaiIsCiAgICBzZWxlY3RMYWIgPSB0YXJnZXRfZ2VuZXNfcWMsCiAgICBheGlzTGFiU2l6ZSA9IDEyLAogICAgeGxhYiA9ICJhdmVyYWdlIGZvbGQtY2hhbmdlIiwKICAgIHRpdGxlID0gIk1peGVkIG1hcmtlcnNcbihNaXhlZCBjZWxsIGNvbW11bml0aWVzIHZzIHRoZSByZXN0KSIsCiAgICB0aXRsZUxhYlNpemUgPSAxNCwKICAgIHBDdXRvZmYgPSAwLjA1L05fR0VORVMsICMgMjA1NTIgZ2VuZXMKICAgIEZDY3V0b2ZmID0gMS4yNSwKICAgIHBvaW50U2l6ZSA9IDEuNSwKICAgIGxhYlNpemUgPSAzLjAsCiAgICBsZWdlbmRMYWJlbHM9YygnTlMnLCdhdmcuIGZvbGQtY2hhbmdlJywnUCcsCiAgICAgICdQICYgYXZnLiBmb2xkLWNoYW5nZScpLAogICAgbGVnZW5kUG9zaXRpb24gPSAicmlnaHQiLAogICAgbGVnZW5kTGFiU2l6ZSA9IDEwLAogICAgbGVnZW5kSWNvblNpemUgPSAzLjAsCiAgICBkcmF3Q29ubmVjdG9ycyA9IFRSVUUsCiAgICB3aWR0aENvbm5lY3RvcnMgPSAwLjIsCiAgICBjb2xDb25uZWN0b3JzID0gIiM1OTVBNUMiLAogICAgZ3JpZGxpbmVzLm1ham9yID0gRkFMU0UsCiAgICBncmlkbGluZXMubWlub3IgPSBGQUxTRSkKIyBNSVhFRF9Wb2xjYW5vX1RhcmdldHNBCmdnc2F2ZShwYXN0ZTAoUExPVF9sb2MsICIvIiwgVG9kYXksICIuVm9sY2Fuby5NSVhFRC5ERUcuVGFyZ2V0cy5wZGYiKSwgCiAgICAgICBwbG90ID0gTUlYRURfVm9sY2Fub19UYXJnZXRzQSkKYGBgCgpUaGUgdGFyZ2V0IHJlc3VsdHMgYXJlIGdpdmVuIGJlbG93IGFuZCB3cml0dGVuIHRvIGEgZmlsZS4KCmBgYHtyIFJlc3VsdHMgTUlYRUR9CmxpYnJhcnkodGliYmxlKQpNSVhFRC5tYXJrZXJzIDwtIGFkZF9jb2x1bW4oTUlYRUQubWFya2VycywgR2VuZSA9IHJvdy5uYW1lcyhNSVhFRC5tYXJrZXJzKSwgLmJlZm9yZSA9IDEpCgp0ZW1wIDwtIE1JWEVELm1hcmtlcnNbTUlYRUQubWFya2VycyRHZW5lICVpbiUgdGFyZ2V0X2dlbmVzX3FjLF0KCkRUOjpkYXRhdGFibGUodGVtcCkKYGBgCgpgYGB7ciBSZXN1bHRzIE1JWEVEOiB3cml0aW5nfQpmd3JpdGUodGVtcCwgZmlsZSA9IHBhc3RlMChPVVRfbG9jLCAiLyIsIFRvZGF5LCAiLk1JWEVELkRFRy5UYXJnZXRzLnR4dCIpLAogICAgICAgcXVvdGUgPSBGQUxTRSwKICAgICAgIHNlcCA9ICJcdCIsIAogICAgICAgc2hvd1Byb2dyZXNzID0gRkFMU0UsIHZlcmJvc2UgPSBGQUxTRSkKYGBgCgojIFNlc3Npb24gaW5mb3JtYXRpb24KCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgVmVyc2lvbjogICAgICB2MS4xLjEKICAgIExhc3QgdXBkYXRlOiAgMjAyMS0xMC0yOQogICAgV3JpdHRlbiBieTogICBTYW5kZXIgVy4gdmFuIGRlciBMYWFuIChzLncudmFuZGVybGFhbi0yW2F0XXVtY3V0cmVjaHQubmwpLgogICAgRGVzY3JpcHRpb246ICBTY3JpcHQgdG8gbG9hZCBzaW5nbGUtY2VsbCBSTkEgc2VxdWVuY2luZyAoc2NSTkFzZXEpIGRhdGEsIGFuZCBwZXJmb3JtIHF1YWxpdHkgY29udHJvbCAoUUMpLCBhbmQgaW5pdGlhbCBtYXBwaW5nIHRvIGNlbGxzLgogICAgTWluaW11bSByZXF1aXJlbWVudHM6IFIgdmVyc2lvbiAzLjUuMiAoMjAxOC0xMi0yMCkgLS0gJ0VnZ3NoZWxsIElnbG9vJywgbWFjT1MgTW9qYXZlICgxMC4xNC4yKS4KCiAgICBDaGFuZ2UgbG9nCiAgICAqIHYxLjEuMSBVcGRhdGUgb24gdGhlIEFFREIuCiAgICAqIHYxLjEuMCBNYWpvciBvdmVyaGF1bDsgdXBkYXRlIHRvIFdPUkNTIHN5c3RlbS4gQWxzbyBpbmNsdWRpbmcgbXVsdGlwbGUgb3B0aW9ucyBmb3Igc2NSTkFzZXEgZGF0YXNldHMuCiAgICAqIHYxLjAuNCBTbWFsbCBidWcgZml4ZXMuCiAgICAqIHYxLjAuMyBGaXhlZCB3ZWlnaHQgZnVydGhlciBieSBleGNsdWRpbmcgc29tZSBncmFwaHMgZnJvbSB0aGUgUm1kIC0gb2J2aW91c2x5IHRoZXNlIGNhbiBiZSBhZGRlZCB3aXRoIHNoYXJpbmcgd2l0aCB0aGlyZCBwYXJ0aWVzLCBidXQgdGhlc2UgYXJlIHRvbyBoZWF2eSBmb3IgYSB0ZW1wbGF0ZS4KICAgICogdjEuMC4yIEZpeGVkIHdlaWdodCBvZiBmaWxlcyAobGltaXQgb2YgMTBNYiBwZXIgZmlsZSBmb3IgdGVtcGxhdGVzKS4gCiAgICAqIHYxLjAuMSBVcGRhdGVkIGJhY2tncm91bmQgaW5mb3JtYXRpb24uCiAgICAqIHYxLjAuMCBJbml0aWFsIHZlcnNpb24uCgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKYGBge3IgZXZhbCA9IFRSVUV9CnNlc3Npb25JbmZvKCkKYGBgCgojIFNhdmluZyBlbnZpcm9ubWVudAoKYGBge3IgU2F2aW5nfQpzYXZlLmltYWdlKHBhc3RlMChQUk9KRUNUX2xvYywgIi8iLFRvZGF5LCIuIixQUk9KRUNUTkFNRSwiLnNjcm5hc2VxX3Jlc3VsdHMuUkRhdGEiKSkKYGBgCgp8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKfC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CnwgPHN1cD7CqSAxOTc5LTIwMjEgU2FuZGVyIFcuIHZhbiBkZXIgTGFhbiBcfCBzLncudmFuZGVybGFhbi0yW2F0XXVtY3V0cmVjaHQubmwgXHwgW3N3dmFuZGVybGFhbi5naXRodWIuaW9dKGh0dHBzOi8vc3d2YW5kZXJsYWFuLmdpdGh1Yi5pbykuPC9zdXA+IHwK